`
韩悠悠
  • 浏览: 825928 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android的Menu状态动态设置方法onPrepareOptionsMenu

 
阅读更多

AndroidMenu状态动态设置方法onPrepareOptionsMenu(Menu menu)  

2010-11-19 20:00:09|  分类: Android开发笔记 |  标签: |字号大中小 订阅

覆盖onPrepareOptionsMenu(Menu menu)这个方法非常的好用,我们可以定义boolean值来进行判断,如果满足条件就可以把菜单栏动态设置成某些状态,比如是否可见,text值等等。

比如我设定一个布尔值addingNew=flase,然后在其他方法体中对addingNew进行重新赋值。在覆盖onPrepareOptionsMenu(Menu menu)中,我们对addingNew进行判断,如果它的值是ture,我们IDREMOVE_TODO的菜单项就设置为text=“cancel”。否则,我们IDREMOVE_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_TODOtext的值
     String removeTitle=getString(addingNew? R.string.cancel:R.string.remove);
     
     MenuItem removeItem=menu.findItem(REMOVE_TODO);
     removeItem.setTitle(removeTitle);
     
   
 //只有当在添加的状态下(addingNew=true)或者ListViewselected的情况下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);
 }
   
}

 

 

onPrepareOptionsMenu onCreateOptionsMenu 的区别

android中创建菜单menu时需要重写ActivityonCreateOptionsMenu(Menumenu)方法,这个方法只在第一次创建的时候调用一次,所以如果之后想对menu进行动态的修改,那么就不能再对onCreateOptionsMenu做什么手脚,就要用到onPrepareOptionsMenu(Menumenu)方法了。

onPrepareOptionsMenuonCreateOptionsMenu不同的是,他在每次按下menu硬键之前会被调用,所以可以在这里动态的改变menu

 

注意:在onPrepareOptionsMenu(Menumenu)函数中,首先需要调用:

super.onPrepareOptionsMenu(menu);

menu.clear();

如果没有clear而直接add的话,那么菜单中菜单项是会“追加”的,这样随着你不停的点menu键,菜单项就不停的增加。

另外,android系统默认的菜单样式是支持最多3个一行,如果有4项就每行2个有2...如果想自定义样式,可以使用xml文件定义样式。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics