2013-07-11 2 views
5

Я использовал следующий хак, чтобы изменить homeAsupIndicator программно.Изменение панели действий homeAsUpIndicator Programamtically

int upId = Resources.getSystem().getIdentifier("up", "id", "android"); 
if (upId > 0) { 
    ImageView up = (ImageView) findViewById(upId); 
up.setImageResource(R.drawable.ic_action_bar_menu); 
up.setPadding(0, 0, 20, 0); 
} 

Но это не работает на большинстве новых телефонов (HTC One, Galaxy S3 и т. Д.). Есть ли способ, который можно изменить равномерно на всех устройствах. Мне нужно, чтобы он менялся только на главном экране. Другие экраны будут иметь значение по умолчанию. Так что не могу использовать styles.xml

+0

какие версий телефоны, в которых они не работают? – user936414

+0

это не работает на android 4.1.1 и старше, потому что нет представления с id = "android: id/up" – Kenumir

+0

@Kenumir Вам нужно сделать это программно. Он не отображается, если вы попробуете его на xml. Он работает и с 4.2 и выше. Я проверил его на nexus 7. Проблема заключалась в том, что он не отображался на всех устройствах. Для меня это не работало на HTC one и Samsung S4, но отлично работало на S3. Однако решение ниже. – Yasir

ответ

18

Это то, что я сделал для улучшения поведения. Я унаследовал базовую тему и создал новую тему, чтобы использовать ее в качестве темы для конкретной деятельности.

<style name="CustomActivityTheme" parent="AppTheme"> 
    <item name="android:homeAsUpIndicator">@drawable/custom_home_as_up_icon</item> 
</style> 

и в манифесте андроида я сделал тему деятельности, как указано выше.

<activity 
     android:name="com.example.CustomActivity" 
     android:theme="@style/CustomActivityTheme" > 
</activity> 

работает отлично. Будет обновляться снова, когда я проверю все устройства, которые у меня есть. Благодаря @faylon для указания в правильном направлении

+1

Наверняка этот ответ является наиболее совместимым, он требует немного дополнительной работы, но он делает трюк! – Necronet

+0

Это сработало наконец, спасибо u :) – Naruto

+0

Превосходно, спасибо за сохранение меня – Naruto

0

использовать getActionBar().setCustomView(int yourView);, потому что у ActionBar нет способа изменить homeUp значок!

+0

getActionBar(). SetCustomView() добавляет пользовательский вид в панель действий. Можно ли его изменить, чтобы изменить homeAsUpIndicator? – Yasir

1

Вы можете добиться этого проще. Попробуйте изменить атрибут homeAsUpIndicator для actionBarStyle в ваших theme.xml и styles.xml.

Если вы хотите заполнить, просто добавьте пробел в изображение.

+0

, устанавливая его в styles.xml, он меняет его для всех действий.Мне нужно, чтобы он был изменен только для одного действия (тот, у которого есть меню) – Yasir

+0

@Ясир, таким образом, вы можете применить новую тему для этой деятельности. – faylon

+0

Спасибо за указатель. Я унаследовал тему приложения и создал отдельную тему для конкретной деятельности. – Yasir

-1
this.getSupportActionBar().setDisplayUseLogoEnabled(true); 
this.getSupportActionBar().setLogo(R.drawable.about_selected); 

Также вы можете определить логотип проявляется в атрибуте андроид: логотип и теги и установить в тему, которую вы хотите использовать логотип вместо значка приложения в панели действий.

+2

Вопрос OP состоял в том, чтобы изменить homeAsUpIndicator, а не логотип самого Acitonbar ... –

3

Все, что вам нужно сделать, это использовать эту строку кода:

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Это изменит значок с индикатором вверх. Чтобы отключить его позже, просто вызовите эту функцию еще раз и передайте false в качестве параметра.

+0

Как изменить его цвет? –

4

API 18 имеет новые методы ActionBar.setHomeAsUpIndicator() - к сожалению, они не поддерживаются в библиотеке поддержки в этот момент

http://developer.android.com/reference/android/app/ActionBar.html#setHomeAsUpIndicator(android.graphics.drawable.Drawable)

редактирования: они теперь поддерживаются поддержка библиотеки http://developer.android.com/reference/android/support/v7/app/ActionBar.html#setHomeAsUpIndicator(android.graphics.drawable.Drawable)

+0

Kwg, когда я попытался использовать этот метод в библиотеке поддержки, я получил ошибку (неопределенный метод) на этом. Я не могу использовать его с * AppCompat *. Это странно. – Fllo

+0

мне кажется, может быть, у вас более старая версия библиотеки поддержки? – kassim

+0

Вправо Kmg! Даже если я обновился из SDK Manager, он не был обновлен в моих текущих проектах. Я, наконец, разрешу, удалив все старые библиотеки вручную и перезагрузив их. Спасибо за совет. – Fllo

2

решение по проверке Resources.getSystem() не работает на всех устройствах, лучшее решение для изменения homeAsUpIndicator чтобы установить его @null в стиле и изменить логотип Reso программно.

Ниже мой код из style.xml

<style name="Theme.HomeScreen" parent="AppBaseTheme"> 
    <item name="displayOptions">showHome|useLogo</item> 
    <item name="homeAsUpIndicator">@null</item> 
    <item name="android:homeAsUpIndicator">@null</item> 
</style> 

В коде вы можете изменить логотип, используя метод setLogo().

getSupportActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for ActionBarCompat 
getActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for default actionbar for post 3.0 devices 

отметить также, что Android API 18 имеет методы для редактирования homeAsUpIndicator программно, refer documentation.

+0

setLogo изменяет логотип, а не homeAsUpIndicator. Таким образом, установка @null просто удаляет указатель вверх повсюду. Метод ActionBar.setHomeAsUpIndicator() действительно нужен нам, но он еще не находится в библиотеке поддержки? – Jordy

+0

мой ответ был обходным путем для проблемы –

+0

@Jordy setHomeAsUpIndicator() еще не существует в библиотеке поддержки, http://developer.android.com/reference/android/support/v7/app/ActionBar.html –

11

Вопрос заключается в изменении динамическиUp Home Indicator, хотя это answer принимал и о Themes и Styles. Я нашел способ сделать это программно, согласно Adneal's answer, который дает мне ключ и особенно правильный способ сделать. Я использовал приведенный ниже код фрагмента, и он хорошо работает на (проверенных) устройствах с API, указанными here.

Для более низких API-интерфейсов я использую R.id.up, который недоступен в более высоком API. Вот почему, я получить этот идентификатор с помощью небольшого обходного который становится родителем home кнопки (android.R.id.home) и его первый ребенок (android.R.id.up):

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    // get the parent view of home (app icon) imageview 
    ViewGroup home = (ViewGroup) findViewById(android.R.id.home).getParent(); 
    // get the first child (up imageview) 
    ((ImageView) home.getChildAt(0)) 
     // change the icon according to your needs 
     .setImageResource(R.drawable.custom_icon_up)); 
} else { 
    // get the up imageview directly with R.id.up 
    ((ImageView) findViewById(R.id.up)) 
     .setImageResource(R.drawable.custom_icon_up)); 
} 

Примечание: Если вы не используете условие SDK, вы получите NullPointerException.

+0

Does эта работа на всех устройствах? Это не сработало для меня на HTC One и Galaxy S4. Хорошо работает на Galaxy S3, хотя – Yasir

+0

Видимо, не @ Ясир, потому что вы так сказали. Однако на всех API, протестированных с помощью * NexusOne, NexusS, GalaxyNexus и Nexus4 *, я получил правильное поведение. Не знаю, почему ваши устройства не работают. Это крушение или просто ничего не происходит? Это может привести к сбою относительно исключения нулевого указателя. – Fllo

+0

@Filo .. Это может быть из-за того, как ОС Android работает от разных поставщиков. У устройств, на которых вы протестировали все, есть чистый Android android. Он также не работает на HTC One. – Yasir

0

Добавление Fllo ответа Change the actionbar homeAsUpIndicator Programamtically

Я был в состоянии использовать этот хак на Android 4+, но не мог понять, почему индикатор вверх/домой вернулся к значениям по умолчанию один, когда виджет поиска был расширен. Посмотрев на иерархию представлений, выясняется, что верхний/домашний индикатор + значок на панели действий имеет 2 реализации, и, конечно, первое включение - это то, когда виджет поиска не расширяется. Итак, вот код, который я использовал, чтобы обойти это, и в обоих случаях изменить индикатор up/home.

mSearchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { 
     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 
      // https://stackoverflow.com/questions/17585892/change-the-actionbar-homeasupindicator-programamtically 
      int actionBarId = getResources().getIdentifier("android:id/action_bar", null, null); 
      View view = getActivity().getWindow().getDecorView().findViewById(actionBarId); 
      if (view == null 
        || !(view instanceof ViewGroup)) { 
       return true; 
      } 
      final ViewGroup actionBarView = (ViewGroup)view; 

      // The second home view is only inflated after 
      // setOnActionExpandListener() is first called 
      actionBarView.post(new Runnable() { 
       @Override 
       public void run() { 
        //The 2 ActionBarView$HomeView views are always children of the same view group 
        //However, they are not always children of the ActionBarView itself 
        //(depends on OS version) 
        int upId = getResources().getIdentifier("android:id/up", null, null); 
        View upView = actionBarView.findViewById(upId); 
        ViewParent viewParent = upView.getParent(); 
        if (viewParent == null) { 
         return; 
        } 
        viewParent = viewParent.getParent(); 
        if (viewParent == null 
          || !(viewParent instanceof ViewGroup)) { 
         return; 
        } 

        ViewGroup viewGroup = (ViewGroup) viewParent; 
        int childCount = viewGroup.getChildCount(); 
        for (int i = 0; i < childCount; i++) { 
         View childView = viewGroup.getChildAt(i); 
         if (childView instanceof ViewGroup) { 
          ViewGroup homeView = (ViewGroup) childView; 
          upView = homeView.findViewById(upId); 
          if (upView != null 
            && upView instanceof ImageView) { 
           Drawable upDrawable = getResources().getDrawable(R.drawable.ic_ab_back_holo_dark_am); 
           upDrawable.setColorFilter(accentColorInt, PorterDuff.Mode.MULTIPLY); 
           ((ImageView) upView).setImageDrawable(upDrawable); 
          } 
         } 
        } 
       } 
      }); 
1

Вы можете попробовать это:

this.getSupportActionBar().setHomeAsUpIndicator(R.drawable.actionbar_indicator); //for ActionBarCompat 
this.getActionBar().setHomeAsUpIndicator(R.drawable.actionbar_indicator); //for default actionbar for post 3.0 devices 

Если вам нужно изменить положение значка, необходимо создать Drawable файл, содержащий «слой-список», как это:

actionbar_indicator .xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:drawable="@drawable/indicator" 
     android:right="5dp" 
     android:left="10dp" /> 
</layer-list> 
+0

Спасибо, вы спасли мое время , –

0

Если кто-то пользуется поддержкой библиотеки-v7 appcompat, вы можете напрямую вызвать этот метод расстояние:.

  • getSupportActionBar() setHomeAsUpIndicator (INT переделал)

В другом случае вы можете использовать это решение:

Смежные вопросы