最近看到一个小工具,可以实现自定义按钮功能,觉得挺有趣的,于是就思考了下实现思路。
现在想到的一种思路是:
1.所有功能对应一个int型数值标记
2.用一个map来把按钮的标示和按钮当前的功能联系起来,功能与1里面给出的对应
3.点击按钮时,根据按钮标示取得对应的功能数值,然后去执行相应的function
一个简单的例子:
public class OnMainButtonClickListener implements OnClickListener {
public static enum enumFuncTag {
func_new, func_help,
func_reserved
};
// 保存btn和func的对应关系
private Map<Integer, enumFuncTag> mBtnFuncMap = new HashMap<Integer, enumFuncTag>();
public OnMainButtonClickListener(Button[] btns) {
// 设置默认对应关系
for (int j = 0; j < btns.length; j++) {
mBtnFuncMap.put(btns[j].getId(), enumFuncTag.func_reserved);
}
}
// 设置对应关系
public void setBtnFunc(int btnID, enumFuncTag funcTag) {
mBtnFuncMap.put(btnID, funcTag);
}
// 获取对应关系
public enumFuncTag getFuncByBtnID(int btnID) {
return mBtnFuncMap.get(btnID);
}
// 这里有一个map 用于btn和function对应 map有init、set、get
// click里先取v.id,然后id去map里找对应func标记
// 然后switch执行func
@Override
public void onClick(View v) {
// 根据id获取对应func
int btnID = v.getId();
enumFuncTag funcTag = getFuncByBtnID(btnID);
LLog.LogI("btnID:"+btnID);
LLog.LogI("funcTag:"+funcTag);
switch (funcTag) {
case func_new:
newFile();
break;
case func_help:
help();
break;
default:
reservedFunc();
break;
}
}
// func列表
public void newFile() {
LLog.LogD("newFile");
}
public void help() {
LLog.LogD("help");
}
public void reservedFunc() {
LLog.LogD("reservedFunc");
}
}
调用:
<span style="white-space:pre"> </span>private Button[] mButtons = new Button[3];
private OnMainButtonClickListener mBtnClickListener = null;
mButtons[0] = (Button)findViewById(R.id.btn_main_lt);
mButtons[1] = (Button)findViewById(R.id.btn_main_ct);
mButtons[2] = (Button)findViewById(R.id.btn_main_rt);
if (mBtnClickListener == null) {
mBtnClickListener = new OnMainButtonClickListener(mButtons);
}
for (int i = 0; i < mButtons.length; i++) {
mButtons[i].setOnClickListener(mBtnClickListener);
}
mBtnClickListener.setBtnFunc(mButtons[0].getId(), OnMainButtonClickListener.enumFuncTag.func_new);
mBtnClickListener.setBtnFunc(mButtons[1].getId(), OnMainButtonClickListener.enumFuncTag.func_help);