2012-09-13 30 views
0

我有一些項目在ActionBar子菜單,我想有條件地禁用,因爲它們不適用於某些上下文。我希望他們顯示爲禁用(灰色)以阻止用戶點擊它們;但如果點擊了,我想顯示一個敬酒通知用戶它爲什麼被禁用(「不能做A因爲沒有B」等)。但是,如果我調用MenuItem.setEnabled(false),似乎所有菜單項單擊事件不會發生。那麼,如何檢測點擊禁用的菜單項呢?Android:如何檢測點擊禁用的菜單項?

public class Temp extends Activity implements OnMenuItemClickListener 
{ 
    boolean mConditional = true; 

    protected void onCreate(Bundle state) 
    { 
     super.onCreate(state); 
    } 

    public boolean onMenuOpened(int featureId, Menu menu) 
    { 
     MenuItem item = (MenuItem) menu.findItem(R.id.item2); 
     if(item != null && mConditional) 
     { 
      item.setEnabled(false); 
      item.setOnMenuItemClickListener(this); 
     } 

     return super.onMenuOpened(featureId, menu); 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem item) 
    { 
     //does not fire if item is disabled 
     Log.e("", item.getTitle().toString()); 
     return true; 
    } 



    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     //does not fire if item is disabled 
     Log.e("", item.getTitle().toString()); 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) 
    { 
     //does not fire if item is disabled 
     Log.e("", item.getTitle().toString()); 
     return super.onMenuItemSelected(featureId, item); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return true; 
    } 
} 

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/menu" 
     android:icon="@drawable/ic_launcher" 
     android:showAsAction="always" 
     android:title="menu"> 
     <menu> 
      <item 
       android:id="@+id/item1" 
       android:showAsAction="always" 
       android:title="item 1"/> 
      <item 
       android:id="@+id/item2" 
       android:showAsAction="always" 
       android:title="item 2"/> 
      <item 
       android:id="@+id/item3" 
       android:showAsAction="always" 
       android:title="item 3"/> 
     </menu> 
    </item> 
</menu> 
+0

你不能點擊禁用的MenuItem。 – Lucifer

+0

爲什麼不根據變量改變文本顏色和按鈕動作?不要禁用它 – mario

+0

@mario有關如何更改MenuItem的文本顏色的任何建議? – ab11

回答

1

不能使用setEnabled這一點。您需要始終啓用菜單項,並通過更改繪圖(或使用porterduff過濾器修改它)來模擬「禁用」狀態 - 請查看this question瞭解如何在Android中調暗圖像)。另外,你需要保持一個標誌,指示該項目的狀態 - tag的菜單項是一個不錯的選擇。理想情況下,你有這樣的事情:

private void setMenuItemEnable(MenuItem item, boolean enabled) { 
    int curstate = ((Integer)item.getTag()).intValue(); 

    if(curState == 1 && enabled || curstate == 0 && !enabled) { 
     return; 
    } 

    if(enabled) { 
     ... //update image to remove dimming 
     item.setTag(1); 
    } 
    else { 
     ... //update image by dimming it 
     item.setTag(0); 
    } 
} 

最後,在onOptionsItemSelected()方法,檢查選擇的菜單項的標記,且如果標記爲1進行操作,或者如果標籤顯示敬酒從視覺上來說,它就是你想要的,在功能上它會做你以後的事情。

+0

關於如何調暗菜單項的更多建議?如上圖所示,MenuItem只是文本,而MenuItem類沒有公開setTextColor或任何類似的方法。另外,即使我能夠模擬禁用的外觀,我也會擔心不同的操作系統版本會使用不同的禁用外觀,所以我的硬編碼禁用外觀不太可能與系統通常使用的外觀相匹配? – ab11

+0

@ ab11沒有其他辦法。您無法禁用該項目,因爲那樣您就無法獲得「點擊」事件。您可以使用'android.R.style'常量模擬禁用狀態以匹配整個操作系統的外觀 –