Android: динамически менять значок ActionBar?

Я хотел бы динамически изменить значок «home» в ActionBar. Это легко сделать в v14 с помощью ActionBar.setIcon (…), но я не могу все равно выполнить это в предыдущих версиях.

Solutions Collecting From Web of "Android: динамически менять значок ActionBar?"

Если вы используете код ActionbarCompat, предоставляемый google, вы можете получить доступ к значку дома через класс ActionBarHelperBase.java для API v4 и далее.

  //code snippet from ActionBarHelperBase.java ... private void setupActionBar() { final ViewGroup actionBarCompat = getActionBarCompat(); if (actionBarCompat == null) { return; } LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams( 0, ViewGroup.LayoutParams.MATCH_PARENT); springLayoutParams.weight = 1; // Add Home button SimpleMenu tempMenu = new SimpleMenu(mActivity); SimpleMenuItem homeItem = new SimpleMenuItem(tempMenu, android.R.id.home, 0, mActivity.getString(R.string.app_name)); homeItem.setIcon(R.drawable.ic_home_ftn); addActionItemCompatFromMenuItem(homeItem); // Add title text TextView titleText = new TextView(mActivity, null, R.attr.actionbarCompatTitleStyle); titleText.setLayoutParams(springLayoutParams); titleText.setText(mActivity.getTitle()); actionBarCompat.addView(titleText); } ... 

Вы должны иметь возможность изменять код на кнопку «Домой», доступную для действий, расширяющих ActionBarActivity и изменяя их таким образом.

Сотовый кажется немного сложнее, и он, похоже, не дает такого легкого доступа. В предположении, его id также должен быть android.R.id.home, чтобы вы могли вытащить это из представления в ActionBarHelperHoneycomb.java

Если ваша панель действий работает как Шерлок и основана на пунктах меню, это мое решение:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem switchButton = menu.findItem(R.id.SwitchSearchOption); if(searchScriptDisplayed){ switchButton.setIcon(R.drawable.menu_precedent); }else{ switchButton.setIcon(R.drawable.icon_search); } return super.onPrepareOptionsMenu(menu); } 

ActionBar будет использовать атрибут android: логотип вашего манифеста, если он предоставлен. Это позволяет использовать отдельные доступные ресурсы для значка (Launcher) и логотипа (ActionBar, между прочим).

Я бы сказал, что вы делаете что-то вроде этого:

 getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_drawer); 

См. Ссылку Как изменить значок actionBarCompat