9-Android之设置Menu菜单循环选择-按键控制
Android4.4, 展锐平台SC9820W
修改ListMenuPresenter
frameworks/base/core/java/com/android/internal/view/menu/ListMenuPresenter.java
public MenuView getMenuView(ViewGroup root) {
...
mMenuView.setOnItemClickListener(this);
// 添加, 设置按键事件
mMenuView.setOnKeyListener(this);
...
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.d(TAG, "keyCode: " + keyCode);
// 添加, 处理向上和向下按键的事件
int action = event.getAction();
if(action == KeyEvent.ACTION_DOWN) {
if(keyCode == KeyEvent.KEYCODE_DPAD_UP) {
int selectedItemPosition = mMenuView.getSelectedItemPosition();
if(selectedItemPosition == 0) {
mMenuView.setSelection(mAdapter.getCount()-1);
return true;
}
}else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
int selectedItemPosition = mMenuView.getSelectedItemPosition();
if(selectedItemPosition == (mAdapter.getCount()-1)) {
mMenuView.setSelection(0);
return true;
}
}
}
return false;
修改MenuPopupHelper
frameworks/base/core/java/com/android/internal/view/menu/MenuPopupHelper.java
public boolean onKey(View v, int keyCode, KeyEvent event) {
...
// 添加, 处理向上和向下的事件
}else if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DPAD_UP) {
int selectedItemPosition = mPopup.getSelectedItemPosition();
if(selectedItemPosition == 0) {
mPopup.setSelection(mAdapter.getCount()-1);
return true;
}
}else if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
int selectedItemPosition = mPopup.getSelectedItemPosition();
if(selectedItemPosition == (mAdapter.getCount()-1)) {
mPopup.setSelection(0);
return true;
}
}
...
}