2013-08-27 69 views
2

我正在創建一個應用程序,其中我有三個項目在操作欄中。我希望當我點擊其中一個項目時,它應該會突出顯示。如何突出顯示操作欄中的項目選擇在Android

我經歷了幾個可用的例子,但得出結論,我將不得不使用 ActionBar Style Generator工具創建樣式。

我提到以下鏈接..但並不滿足

how to highlight a menu item on selection?

這是去了解的唯一途徑?

<!-- Application theme. --> 
<style name="AppTheme" parent="AppBaseTheme"> 
    <item name="android:actionBarItemBackground">@drawable/action_bar_item_selector</item> 
    <!-- All customizations that are NOT specific to a particular API-level can go here. --> 
</style> 

selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:state_focused="true" 
    android:drawable="@drawable/ic_action_blue" /> 
    <item android:state_pressed="true" 
    android:drawable="@drawable/ic_action_green" /> 
    <item android:drawable="@android:color/transparent" /> 
</selector> 

但因爲它是state_pressed和state_focused選擇不會停滯不前。

我希望項目保持突出顯示狀態,直到用戶處於該活動狀態。

回答

0

我正在創建一個應用程序,其中我有三個項目在操作欄中。 I 希望當我點擊其中一個項目時,它應該會突出顯示。

我不知道下面會正常工作:

每個菜單項的創建兩套圖標:一個默認的樣子,其他的高亮顯示(以任何方式你覺得:變化顏色,改變背景顏色等)。聲明一個全局變量Menu保存菜單項:

// Global variable // Not good practice, but needed in this case 
Menu mainMenu; 

.... 
.... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_name, menu); 

    mainMenu = menu; 

    return true; 
} 

onMenuItemSelected(int featureId, MenuItem item)

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 

    for (int i = 0; i < mainMenu.size(); i++) { 

     // Set default icons 
     if (mainMenu.getItem(i).getItemId() == R.id.action1) { 
      mainMenu.getItem(i).setIcon(R.drawable.icon_default1); 
     } else if (mainMenu.getItem(i).getItemId() == R.id.action2) { 
      mainMenu.getItem(i).setIcon(R.drawable.icon_default2); 
     } else if (.....) { 
      ..... 
     } 
    } 

    if (item.getItemId() == R.id.action1) { 
     item.setIcon(R.drawable.icon_highlighted1); 
    } else if (item.getItemId() == R.id.action2) { 
     item.setIcon(R.drawable.icon_highlighted2); 
    } else if(.....) { 
     ..... 
    } 

    return super.onMenuItemSelected(featureId, item); 
} 

我想你可以通過對item.getItemId()for-loop本身內部檢查微調這一點。

+0

這似乎是完美的工作。但這是唯一的方法嗎? –

+0

@anuja'這似乎是完美的。但這是唯一的方法嗎?'。在我看來,這更像是一種解決方法。我不確定是否存在另一種解決方案。 – Vikram

1

您可以定義主題並繼承所需的操作欄主題(例如Theme.Sherlock.Light.DarkActionBar),將android:actionBarItemBackground屬性的值設置爲覆蓋繼承主題中的默認主題。

<style name="MyTheme" parent="Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:actionBarItemBackground">custom_selector</item> 
</style> 
+0

我編輯了我的問題。 –

+0

檢查我的新答案! –

0

好了,我建議你在你的menu.xml創建兩個不同的項目:

<item 
    android:id="@+id/action_item1" 
    /> 


<item 
    android:id="@+id/action_item2" 
    android:visible="false" 
    /> 

然後,在你想突出你的項目活動,覆蓋上onPrepareOptionsMenu,使用menu paremeter通過使用menu.findItem(R.id.your_item_id)捕捉您想要的項目。最後切換項目的可見性。

您需要refresh你的動作條自動項目使用invalidateOptionsMenu

讓我知道這是否有助於!

4

的處理問題,更優雅的方式,是簡單地有一個布爾值,將檢查 兩種狀態下,如果你使用的是有不同的狀態顏色相同的繪製,我會建議 您使用colorFilter方法來應用到你的drawables。

private boolean mSomeValue = true; 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
     // determine the menu item you want to highlight when selected 
     switch(item.getItemId) { 
      case yourItem : { 
       if (mSomeValue) { 
        item.getIcon().setColorFilter(YourColor, PorterDuff.Mode.MULTIPLY); 
        mSomeValue = false; 
       } else { 
        mSomeValue = true; 
        item.getIcon().setColorFilter(Default, PorterDuff.Mode.MULTIPLY); 
       } 
      break; ... 
      } 
     } 
     return super.onOptionsItemSelected(item); 
} 
+0

這對於像android:icon =「@ android:drawable/ic_menu_view」和Color.DKGRAY來模擬正常狀態下的按下狀態和clearColorFilter()圖標特別好。 –

相關問題