Android的Menu状态动态设置方法onPrepareOptionsMenu(Menu menu) (转载)
覆蓋onPrepareOptionsMenu(Menu menu)這個方法非常的好用,我們可以定義boolean值來進行判斷,如果滿足條件就可以把菜單欄動態設置成某些狀態,比如是否可見,text值等等。?
比如我設定一個布爾值addingNew=flase,然后在其他方法體中對addingNew進行重新賦值。在覆蓋onPrepareOptionsMenu(Menu menu)中,我們對addingNew進行判斷,如果它的值是ture,我們ID為REMOVE_TODO的菜單項就設置為text=“cancel”。否則,我們ID為REMOVE_TODO的菜單項就設置為text=“remove”。?
總之,就是可以進行一些判斷,然后動態設置我們的菜單項狀態。?
另外一點,我們應該積累經驗,學會很好的運用boolean值,這在很多地方都很有用。?
下面是我的程序,從中可以總結出很多經驗。?
public class ToDolist extends Activity {?
??? /** Called when the activity is first created. */?
????
??? static final private int ADD_NEW_TODO=Menu.FIRST;?
??? static final private int REMOVE_TODO=Menu.FIRST+1;?
??? private boolean addingNew=false;//設置這個值來進行控制?
??? private ListView myListView;?
??? private EditText myEditText;?
??? private ArrayList<String> todoItems;?
??? private ArrayAdapter<String> aa;?
????
??? @Override?
??? public void onCreate(Bundle savedInstanceState) {?
??????? super.onCreate(savedInstanceState);?
??????? setContentView(R.layout.main);??
????????
??????? myListView=(ListView)findViewById(R.id.myListView);?
??????? myEditText=(EditText)findViewById(R.id.myEditText);?
??????? todoItems=new ArrayList<String>();?
????????
??????? int resID=R.layout.todolist;?
??????? aa=new ArrayAdapter<String>(this, resID, todoItems);?
??????? myListView.setAdapter(aa);?
????????
??????? myEditText.setOnKeyListener(new OnKeyListener(){?
?? @Override?
?? public boolean onKey(View v, int keyCode, KeyEvent event) {?
??? // TODO Auto-generated method stub?
??? if(event.getAction()==KeyEvent.ACTION_DOWN){?
???? if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER){?
????? todoItems.add(0, myEditText.getText().toString());?
????? aa.notifyDataSetChanged();?
????? myEditText.setText("");?
????? cancelAdd();//初始設定REMOVE_TODO菜單項不可見,myEditText不可見?
????? return true;?
???? }?
??? }?
??? return false;?
?? }});?
??????? registerForContextMenu(myListView);//設置myListView為一個ContextMenu的接收者?
???
??? }?
????
??? public boolean onCreateOptionsMenu(Menu menu){?
???? super.onCreateOptionsMenu(menu);?
???? MenuItem itemAdd=menu.add(0, ADD_NEW_TODO, Menu.NONE, R.string.add_new);?
???? MenuItem itemRem=menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);?
?????
???? itemAdd.setIcon(R.drawable.add_new_item);?
???? itemRem.setIcon(R.drawable.remove_item);?
?????
???? itemAdd.setShortcut('0', 'a');?
???? itemRem.setShortcut('1', 'r');?
?????
? return true;?
?????
??? }?
????
????
??? public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo){?
???? super.onCreateContextMenu(menu, v, menuInfo);?
?????
???? menu.setHeaderTitle("Selected To Do Item");?
???? menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);?
?????
??? }//創建了ContextMenu?
????
??? @Override?
??? public boolean onPrepareOptionsMenu(Menu menu){?
?????
???? super.onPrepareOptionsMenu(menu);?
???? int idx=myListView.getSelectedItemPosition();?
?????
???? //通過addingNew的判斷來確定REMOVE_TODO的text的值?
???? String removeTitle=getString(addingNew? R.string.cancel:R.string.remove);?
?????
???? MenuItem removeItem=menu.findItem(REMOVE_TODO);?
???? removeItem.setTitle(removeTitle);?
?????
???? //只有當在添加的狀態下(addingNew=true)或者ListView被selected的情況下REMOVE_TODO菜單項才可見?
???? removeItem.setVisible(addingNew||idx>-1);?
?????
? return true;?
?????
??? }?
????
??? @Override?
??? public boolean onOptionsItemSelected(MenuItem item){?
???? super.onOptionsItemSelected(item);?
?????
???? int index=myListView.getSelectedItemPosition();?
?????
???? switch(item.getItemId()){?
???? case(REMOVE_TODO):{?
????? //此時的REMOVE_TODO菜單的text可能有兩種狀態:1.cancel 2.remove?
????? if(addingNew){?
?????? //當addingNew=true的時候,REMOVE_TODO菜單的text=“cancel”,這時候我們就執行相應的取消操作?
?????? cancelAdd();?
????? }else{?
?????? removeItem(index);?
?????? //當addingNew=false的時候,REMOVE_TODO菜單的text=“remov”,這時候我們就執行相應的刪除操作?
????? }?
????? return true;?
???? }?
???? case(ADD_NEW_TODO):{?
????? addNewItem();?
????? return true;?
???? }?
???? }?
? return false;?????
??? }?
????
??? @Override?
??? public boolean onContextItemSelected(MenuItem item){?
???? super.onContextItemSelected(item);?
?????
???? switch (item.getItemId()){?
???? case(REMOVE_TODO):{?
????? AdapterView.AdapterContextMenuInfo menuInfo;?
????? menuInfo=(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();?
????? int index=menuInfo.position;?
??????
????? removeItem(index);?
????? return true;?
???? }?
???? }?
? return false;?
?????
??? }?
????
??? //在下面3個方法總執行相應的工作,并且對addingNew進行控制?
private void addNewItem() {?
? // TODO Auto-generated method stub]?
? addingNew=true;?
? myEditText.setVisibility(View.VISIBLE);?
? myEditText.requestFocus();?
??
}?
private void removeItem(int _index) {?
? // TODO Auto-generated method stub?
? todoItems.remove(_index);?
? aa.notifyDataSetChanged();?
??
}?
private void cancelAdd() {?
? // TODO Auto-generated method stub?
? addingNew=false;?
? myEditText.setVisibility(View.GONE);?
}?
????
}?
轉載于:https://www.cnblogs.com/joey-home/archive/2012/02/27/2370160.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Android的Menu状态动态设置方法onPrepareOptionsMenu(Menu menu) (转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MD5 算法 实现
- 下一篇: 数据库行转列的sql语句(zt)