`
chenhaodejia
  • 浏览: 114518 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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);
}
   
}

 

 

:博客涉及的源码请在千寻资源库www.qxzyk.com 下载获取,谢谢支持。

分享到:
评论

相关推荐

    Android Menu的设置方法

    本篇文章将详细介绍如何在Android中设置Menu,主要分为两种方法:通过Layout添加静态菜单元素和在Activity类中动态创建Menu。 **第一种方法:通过Layout添加静态菜单元素** 1. **创建XML布局文件**: 在`res/...

    Android MenuDemo Menu全面讲解

    在某些情况下,可能需要在运行时根据应用程序的状态动态地添加或移除Menu项。这可以通过在`onPrepareOptionsMenu(Menu menu)`方法中进行操作: ```java @Override public boolean onPrepareOptionsMenu(Menu menu) ...

    Android menu单选菜单.zip

    - 如果需要设置默认选中的菜单项,可以重写`onPrepareOptionsMenu(Menu menu)`方法,在其中调用`menu.findItem(R.id.your_menu_item_id).setChecked(true)`来设置。 5. **更新UI状态** - 当`RadioButton`的状态...

    Android 按Menu弹出菜单

    这时,我们可以在`onPrepareOptionsMenu(Menu menu)`方法中动态地添加、修改或删除菜单项。 总的来说,Android中的Menu机制是提供给用户便捷访问应用功能的关键组件。通过合理的布局设计、交互逻辑以及视觉效果,...

    android menu学习

    6. **菜单状态的控制**:在Activity的生命周期中,可以通过`onPrepareOptionsMenu(Menu menu)`方法来更新菜单项的状态,比如根据用户权限或应用状态改变某个菜单项的可见性或启用状态。 7. **检查与多选**:通过...

    Android 动态更新Menu菜单

    要动态更新Menu,我们需要在适当的时候调用`invalidateOptionsMenu()`方法,这会触发`onPrepareOptionsMenu`方法的调用。在`onPrepareOptionsMenu`中,我们可以根据需要添加、删除或修改菜单项。 ```java @Override...

    android 以动态列表配置选项 ListActivity 与Menu整合技巧

    `invalidateOptionsMenu()`方法会触发`onPrepareOptionsMenu`方法重新绘制菜单,你可以在这里根据当前的上下文状态修改菜单项的可见性或启用状态。 总结,整合`ListActivity`与`Menu`的关键在于理解它们各自的功能...

    android 选项菜单(此处为icon menu)--Menu,SubMenu,MenuItem的用法

    在实际项目中,我们还可以结合`onPrepareOptionsMenu(Menu menu)`方法来更新菜单的状态,比如根据用户权限或当前数据状态来显示或隐藏某些菜单项。 综上所述,理解和掌握`Menu`, `SubMenu`, `MenuItem`的使用是...

    Android提高十八篇之自定义Menu(TabMenu)

    通过重写`onPrepareOptionsMenu`和`onCreateOptionsMenu`方法,可以实现菜单项的动态更新和自定义样式。例如,改变菜单项的颜色、字体大小等。 4. **TabMenu的理解与实现** TabMenu通常用于在多个视图间切换,...

    android menu的使用

    - 在某些情况下,可能需要根据应用的状态动态地添加或移除菜单项,这可以通过`onPrepareOptionsMenu(Menu menu)`方法实现。 8. **菜单与Fragment的配合** - 如果应用使用了Fragment,菜单也可以在Fragment中创建...

    Android动态添加menu菜单的简单方法

    方法名 触发时间onCreateOptionsMenu 进入Launcher后第一次点MENU按钮时触发onPrepareOptionsMenu 有两种情况:1、进入Launcher后第一次点MENU按钮触发onCreateOptionsMenu后调用;2、经过第一步,以后每次点MENU...

    AndroidMenu控件Demo

    - 如果菜单需要动态更新,可以在`onPrepareOptionsMenu(Menu menu)`方法中进行,这个方法在菜单显示之前调用,适合根据应用状态改变菜单项。 总的来说,"AndroidMenu控件Demo"是一个很好的学习资源,通过它,...

    android menu菜单使用

    Android还支持动态添加菜单项,这在某些情况下很有用,比如根据用户权限或状态来决定是否显示某个菜单。你可以在`onPrepareOptionsMenu`方法中实现这一功能: ```java @Override public boolean ...

    android各组件详解- Menu

    - **onPrepareOptionsMenu(Menu menu)**:当OptionsMenu再次显示时(例如用户切换了其他应用后再返回),会调用此方法以允许开发者更新菜单的内容。这里可以动态地更改菜单项的状态,比如根据用户的权限决定是否显示...

    Android menu 菜单实例

    - `onPrepareOptionsMenu(Menu menu)`:每次菜单即将显示时调用,可用于根据当前状态动态更新菜单。 - `onOptionsItemSelected(MenuItem item)`:用户点击菜单项时调用,执行相应的动作。 4. **菜单图标** 菜单...

    Android初级入门——菜单Menu的简单使用

    这可以通过在`onPrepareOptionsMenu(Menu menu)`方法中修改菜单资源来实现。 总之,Android菜单系统提供了一种灵活的方式来展示和管理应用程序的功能选项。理解并熟练运用菜单对于Android开发者来说至关重要,因为...

    Android---UI篇---Menu(菜单)

    在实际开发中,为了使菜单适应不同的屏幕尺寸和方向,可能需要使用`onPrepareOptionsMenu(Menu menu)`方法进行动态调整。同时,考虑到无障碍性,菜单项的顺序和标签应能被辅助技术如屏幕阅读器正确读取。 总的来说...

    Android menu单选菜单.rar

    - `onPrepareOptionsMenu(Menu menu)`: 在每次菜单显示之前调用,可用来动态更新菜单。 - `onOptionsItemSelected(MenuItem item)`: 当用户点击菜单项时调用,处理用户的菜单选择。 二、创建单选菜单 1. **XML...

    Android menu

    这可以通过在`onPrepareOptionsMenu(Menu menu)`方法中实现。 6. **菜单的可见性和启用状态**: 可以通过`MenuItem.setVisible(false)`和`MenuItem.setEnabled(false)`方法控制菜单项的可见性和可点击性。 7. **...

    Pro Android学习:Menu

    此外,我们还可以通过重写`onPrepareOptionsMenu(Menu menu)`方法来在菜单显示之前进行动态修改,例如根据用户状态或权限来隐藏或显示某些菜单项。 在实际应用中,菜单不仅限于动作栏,还可以通过其他方式呈现,如...

Global site tag (gtag.js) - Google Analytics