#android #icons #toolbar
#Android #Значки #панель инструментов
Вопрос:
Я использовал этот пример кода для создания панели инструментов для моего приложения. https://blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar
Одним из моих элементов является кнопка отключения звука для моего приложения. Таким образом, значок является стандартным значком динамика. При нажатии кнопки приложение либо отключается, либо включается. Это работает так, как должно, но мне нужно изменить значок, чтобы он соответствовал настройке.
Я пробовал следующий код, но он не меняет значок.
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);
}
}
}
Есть идеи о том, как это сделать?
Ответ №1:
Правильный способ сделать это — переопределить onPrepareOptionsMenu
метод в вашей деятельности.
Допустим, у вас есть приложение, в котором пользователи могут «Избранный» или «Не избранный» элемент. Сначала создайте 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
методе вашей деятельности, вы можете обработать событие «щелчок» для каждого из них. Затем, чтобы переключить видимость значков, вызовите 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
Надеюсь, это поможет!
Ответ №2:
Вы можете использовать объект toolbar, чтобы получить соответствующий дочерний элемент в представлении (ImageView), View view = toolbar.getChildAt(index);
а затем использовать setImageResource()
или любую другую функцию для изменения значка.