2016-10-04 26 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

相关问题