2016-10-04 27 views
1

我用這個示例代碼爲我的應用程序創建一個工具欄。 https://blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar如何以編程方式更改android工具欄中的圖標?

我的一個項目是我的應用程序的靜音按鈕。所以圖標是標準的揚聲器圖標。點擊該按鈕後,該按鈕可以靜音或取消靜音。這工作正常,但我需要更改圖標以匹配設置。

我試過下面的代碼,但它不會更改圖標。

public override bool OnCreateOptionsMenu(IMenu menu) 
    { 
     MenuInflater.Inflate(Resource.Menu.home, menu); 
     _menu = menu; 

     return base.OnCreateOptionsMenu(menu); 
    } 

    private void setActionIcon_mute(bool setmuteicon) 
    { 
     IMenuItem item = _menu.FindItem(Resource.Id.mmute); 

     if (_menu != null) 
     { 
      if (setmuteicon) 
      { 
       //mute it 
       //this does nothing 
       item.SetIcon(Resource.Drawable.ic_volume_off_white_24dp); 
      } 
      else 
      { 
       //unmute it 
       //this does nothing 
       item.SetIcon(Resource.Drawable.ic_volume_mute_white_24dp); 
      } 
     } 
    } 

有關如何做到這一點的任何想法?

回答

0

可以使用工具欄對象將相應的子進入視圖(ImageView) - View view = toolbar.getChildAt(index);,然後使用setImageResource()或任何其他功能更改圖標。

2

正確的做法是重寫活動中的onPrepareOptionsMenu方法。

假設您有一個應用程序,用戶可以在其中選擇'Favorite'或'Un-Favorite'項目。首先,用兩個菜單項創建menu.xml,並將visible屬性設置爲true,對另一個設置爲false。

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.myapp.SoloActivity"> 

    <item android:id="@+id/add_favorite" 
     android:title="Favorite" 
     android:icon="@drawable/ic_favorite_border_black_24dp" 
     android:visible="true" 
     app:showAsAction="always" /> 

    <item android:id="@+id/remove_favorite" 
     android:title="Favorite" 
     android:icon="@drawable/ic_favorite_black_24dp" 
     android:visible="false" 
     app:showAsAction="always" /> 
</menu> 

接下來,在你的活動,覆蓋onPrepareOptionsMenu方法和確定要顯示的菜單項。

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    if (IsFavorite) { 
     menu.findItem(R.id.add_favorite).setVisible(false); 
     menu.findItem(R.id.remove_favorite).setVisible(true) 
    } else { 
     menu.findItem(R.id.add_favorite).setVisible(true); 
     menu.findItem(R.id.remove_favorite).setVisible(false) 
    } 
} 

現在,在您的活動的onOptionsItemSelected方法中,您可以爲每個方法處理'click'事件。然後,要切換圖標的可見性,請撥打invalidateOptionsMenu();

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    switch (id) { 
     case R.id.add_favorite: 
      IsFavorite = !IsFavorite; 
      Toast.makeText(this, "Added to Favorites", Toast.LENGTH_SHORT).show(); 
      invalidateOptionsMenu(); 
      break; 

     case R.id.remove_favorite: 
      IsFavorite = !IsFavorite; 
      Toast.makeText(this, "Removed from Favorites", Toast.LENGTH_SHORT).show(); 
      invalidateOptionsMenu(); 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

調用invalidateOptionsMenu();將導致菜單被重繪,這將導致onPrepareOptionsMenu再次調用。

這是在運行時處理對菜單項進行更改的推薦方式。

文檔可以在這裏找到:https://developer.android.com/guide/topics/ui/menus.html

我希望這有助於!

+0

@ user3302938,如果這能夠充分回答您的問題,請將其標記爲答案(我可以使用聲望)。如果您覺得它不能回答您的問題,請發表評論,以便我們深入瞭解問題。謝謝。 – dshrout

相關問題