2012-07-24 29 views
31

在菜單項中使用actionLayout時,未調用onOptionsItemSelected方法。 我錯過了什麼,或者它是SherlockActionBar的已知問題?onOptionsItemSelected在使用actionLayout(SherlockActionBar)時未調用

活動

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.article, menu); 

    super.onCreateOptionsMenu(menu); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "onOptionsItemSelected()"); 

    switch (item.getItemId()) {   
     case android.R.id.home:    
      finish();  
      return true; 
     case R.id.menu_item_comment: 
      return true; 
     default:    
      return super.onOptionsItemSelected(item);  
    } 
} 

菜單

<item android:id="@+id/menu_item_comment" 
    android:showAsAction="ifRoom" 
    android:actionLayout="@layout/action_bar_comment_layout"/> 

+0

'@ layout/action_bar_comment_layout'是怎麼樣的? – 2012-11-29 09:57:58

回答

40

好,你必須設置onClickListener對actionLayout接收回調。我不喜歡這樣寫道:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.map_menu, menu); 
    for (int i = 0; i < menu.size(); i++) { 
     MenuItem item = menu.getItem(i); 
     if (item.getItemId() == R.id.menu_more) { 
      itemChooser = item.getActionView(); 
      if (itemChooser != null) { 
       itemChooser.setOnClickListener(this); 
      } 
     } 
    } 
    return super.onCreateOptionsMenu(menu); 
} 
+15

工作正常,謝謝。順便說一句,你可以使用findItem而不是迭代所有菜單項 – user634545 2012-07-24 12:04:47

+4

可以縮短爲: public boolean onCreateOptionsMenu(Menu menu){ getSupportMenuInflater()。inflate(R.menu.map_menu,menu); menu.findItem(R.id.menu_more).getActionView()setOnClickListener(本)。 return super.onCreateOptionsMenu(menu); } – roflharrison 2014-01-16 09:32:07

+1

您應該使用MenuItemCompat.getActionView(item)和actionbarcompat。 – Sver 2014-06-17 06:36:01

9

您應該使用MenuItemCompat.getActionView(菜單項);而不是item.getActionView();如果您正在開發舊版本。

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu, menu); 
     for (int i = 0; i< menu.size() ;i++) { 
      MenuItem menuItem = menu.getItem(i); 
      if (menuItem.getItemId() == R.id.add_item) { 
       View view = MenuItemCompat.getActionView(menuItem); 
       if (view != null) { 
        view.setOnClickListener(new OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          Intent intent = new Intent(MainActivity.this, ToDoActivity.class); 
          startActivity(intent); 
         } 
        }); 
       } 
      } 
     }  
     return true; 
    } 
6

你必須添加自己的OnClickListener並明確調用onOptionsItemSelected

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome); 
    View awesomeActionView = menuItem.getActionView(); 
    awesomeActionView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onOptionsItemSelected(awesomeMenuItem)); 
     } 
    }); 
} 

P.S:不知道爲什麼它不開箱的工作。

0
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.main, menu); 
    View view = menu.findItem(R.id.menu_item_comment).getActionView(); 
    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // do something 
     } 
    }); 
    return true; 
} 

另外,(這是非常重要的我,所以其他的答案沒有工作),你需要禁用的在動作設計所有視圖(即action_bar_comment_layout.xml)可點擊的選項:

android:clickable="false" 
1

結合@Arun Kumar和@ Luten的答案,下面的方法將使實現通用。對於使用actionView的所有菜單項,我們setOnClickListener致電onOptionsItemSelected(item)。 通過這種方式,我們可以混合和匹配normal和actionLayout菜單項,而不用擔心設置單個onClickListeners。

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    menu.clear(); 
    inflater.inflate(menuResourceId(), menu); 

    for (int i = 0; i < menu.size(); i++) { 
     final MenuItem item = menu.getItem(i); 
     View actionView = MenuItemCompat.getActionView(item); 
     if (actionView != null) { 
      actionView.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        onOptionsItemSelected(item); 
       } 
      }); 
     } 
    } 

    super.onCreateOptionsMenu(menu, inflater); 
} 
+0

非常好 - 謝謝!可悲的是,我們需要這樣一個snipet,而框架本身並不包含它...... – 2017-11-13 21:44:22

相關問題