Android的Menu狀態動態設定方法onPrepareOptionsMenu(Menu menu)

來源:互聯網
上載者:User

覆蓋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); 

    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.