Изменение значков в ActionBar динамически

У меня есть Activity которого есть ActionBar но мне нужно динамически менять значки на ActionBar , у меня есть пауза и кнопка воспроизведения , и мне нужно заменить кнопку воспроизведения кнопкой паузы , когда пользователь нажимает на нее. Я обыскал и нашел:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if(DEBUG) Log.i("onCreateOptionsMenu()", "onCreateOptionsMenu() -> LogicAnalizerView"); //menu.add("").setIcon(R.drawable.pause).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbarlogic, menu); menu.removeItem(R.id.pauseLogic); return true; } 

Таким образом, я удаляю кнопку « Пауза» , и я могу добавить ее тоже, но это происходит только при запуске Activity и ActionBar . Как я могу заставить перерисовать ActionBar ? Кроме того, таким образом весь ActionBar перерисовывается. Это правильно? Есть ли способ перерисовать только кнопку / значок, который я хочу?

Спасибо 🙂

Вам нужно будет сэкономить ссылку на MenuItem после инфляции. Так что примерно следующее:

 public boolean onCreateOptionsMenu( Menu menu ) { MenuInflater inflater = getMenuInflater(); inflater.inflate( R.menu.actionbarlogic, menu ); playMenu = menu.findItem(R.id.playMenu); updatePlayStatus(); return menu; } public void updatePlayStatus() { if( playService.isConnected() ) { playService.isPlaying() ? playMenu.setIcon(R.drawable.pause) : playMenu.setIcon(R.drawable.play); } } 

Затем вы можете обращаться к playMenu в любое время. Таким образом, вы можете изменить элемент, как говорят, что ваш игрок заканчивает игру и должен вернуться к значку воспроизведения.

Вместо их удаления вы можете просто скрыть кнопку, которую вы не хотите отображать.

Например:

 private boolean isPlaying; MenuItem mPlayMenuItem; MenuItem mPauseMenuItem; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbarlogic, menu); mPlayMenuItem = menu.findItem(R.id.action_play); mPauseMenuItem = menu.findItem(R.id.action_pause); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_play: isPlaying = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } return true; case R.id.action_pause: isPlaying = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onPrepareOptionsMenu (Menu menu) { super.onPrepareOptionsMenu(menu); if (isPlaying) { mPlayMenuItem.setVisible(false); // hide play button mPauseMenuItem.setVisible(true); // show the pause button } else if (!isPlaying) { mPlayMenuItem.setVisible(true); // show play button mPauseMenuItem.setVisible(false); // hide the pause button } return true; } 

Просто примечание:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } 

Требуется для обновления панели действий. После 3.0 устройств панель действий автоматически не обновляется. Итак, вы должны вручную сказать ему, чтобы вызвать «OnPrepareOptionsMenu (Меню)», чтобы обновить элементы, вызвав «Activity.invalidateOptionsMenu ()».

Надеюсь это поможет!

Ссылка: http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu)

http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#invalidateOptionsMenu(android.app.Activity)

 private Menu mMenu; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main_activity, menu); // Save the menu reference mMenu = menu; return super.onCreateOptionsMenu(menu); } // For example - Call when you need to change icon private void setActionIcon(boolean showWithBadge) { MenuItem item = mMenu.findItem(R.id.ITEM_ID); if(mMenu != null) { if(showWithBadge) { item.setIcon(R.drawable.IC_WITH_BADGE); } else { item.setIcon(R.drawable.IC_WITHOUT_BADGE); } } } 

Если вы хотите получить первый пункт в своем меню, **

use menu.getItem(0);

Этот Кодекс абсолютно совершенен:

  @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.my_menu, menu); MenuItem m = menu.getItem(0); m.setIcon(R.drawable.your_icon_here); } return true; } 

Переопределите onPrepareOptionsMenu в своем классе активности, а затем вы можете добавлять / удалять или видимые / невидимые пункты меню.

Intereting Posts
Как правильно настроить Volley для загрузки изображений с URL-адреса Универсальный URI универсального Image Loader от InputStream Добавление формы в LinearLayout Android Автоматически регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks? Обработка и сглаживание IllegalStateException («состояние сохранения сбрасывания: активный $ Фрагмент очистил индекс: -1») Как оживить FloatingActionButton новой библиотеки поддержки дизайна Android-версия 2.0 несовместимого изображения системы местоположения ScrollView alawys прокручивается на дно Android Gradle Build Exception packageReleaseResources шаг в Android-библиотеке Установите фактическое заполнение текста в TextView с составными чертежами Неисправность Backstack активности при разрушении деятельности Открытие веб-страницы в приложении для Android Распознавание речи с использованием ионного каркаса Android: хорошее (стандартное) меню настроек Реализация Pinch и Zoom на Android SurfaceView