2016-02-26 9 views
27

Na urządzeniach pre-Lollipop ikona menu przepełnienia i przycisk Wstecz na pasku czynności zmieniono na kolor czarny po uaktualnieniu do biblioteki pomocy technicznej 23.2.0 . Są białe (co jest odpowiednim kolorem) przed uaktualnieniem.Ikony ze strzałkami w tył i przepełnienie Nieprawidłowy kolor w urządzeniach pre-Lollipop po aktualizacji do biblioteki pomocy technicznej 23.2.0

Prawidłowy kolor: enter image description here

niewłaściwy kolor pojawia się na pre-Lollipop urządzeń po aktualizacji, jak pokazano ikony menu overflow:

enter image description here

Tematem w SYTLE. xml (pre-v21/Lollipop):

<resources xmlns:android="http://schemas.android.com/apk/res/android" > 
    <!--Used on the application level by the manifest.--> 
    <style name="app_theme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="colorPrimary">@color/app_primary_colour</item> 
     <item name="colorPrimaryDark">@color/app_primary_dark_colour</item> 
     <item name="colorAccent">@color/app_accent_colour</item> 
     <item name="android:windowBackground">@color/app_background</item> 
     <item name="searchViewStyle">@style/custom_search_view_style</item> 
    </style> 

    <!--Used by activities.--> 
    <style name="app_theme.NoActionBar"> 
     <item name="windowActionBar">false</item> 
     <item name="windowNoTitle">true</item> 
    </style> 

    <!--TODO: What are these?--> 
    <style name="app_theme.app_bar_overlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> 
    <style name="app_theme.popup_overlay" parent="ThemeOverlay.AppCompat.Light" /> ... ... </resources> 

Mam wyglądały here i here, ale nie rozwiązałem problemu.

UPDATE: zobaczyć również ten raport o błędzie Google: https://code.google.com/p/android/issues/detail?id=201918

+2

Mam również ten problem .. Zdarza się tylko w wersji preLL i działa dobrze z v23.1.1 – W0rmH0le

+1

, aby strzałka wstecz nagle zmieniła się na kolor czarny: '( – sector11

Odpowiedz

35

mogę naprawić.

stwierdziliśmy, że AppCompat motyw wykorzystuje następujące zasób dla przycisku przelewowego: abc_ic_menu_overflow_material.xml

Zawartość tego zasobu:

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
     android:width="24dp" 
     android:height="24dp" 
     android:viewportWidth="24.0" 
     android:viewportHeight="24.0" 
     android:tint="?attr/colorControlNormal"> 
    ... 
</vector> 

Następnie podłączyłem kropki:

  • First: Używa colorControlNormal
  • Po drugie: Używa wektora

Jak naprawić

Według notatek Biblioteka V23.2.0 uwalnianiu (LINK HERE), musimy zaktualizować build.gradle dodać wsparcie Vector:

build.gradle

Dodaj kolejne linie do swojej oceny budowy

Gradle 2.0 (nie testowałem):

android { 
    defaultConfig { 
     vectorDrawables.useSupportLibrary = true 
    } 
} 

Gradle 1,5 (używam tego .. to działa):

android { 
    defaultConfig { 
     generatedDensities = [] 
    } 

    aaptOptions { 
     additionalParameters "--no-version-vectors" 
    } 
} 

Mocowanie motywu

Ten krok może być ignorowane. Niektóre motywy podstawowe ustawiono już na colorControlNormal na biały (np. AppCompat.Dark.ActionBar).

Jednak w moim przypadku wszystkie kolory przycisków pozostały czarne i musiałem dodać do mojego motywu colorControlNormal i nadpisać go białym kolorem.

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="colorControlNormal">@color/white</item> 
</styel> 

Mam nadzieję, że to może ci pomóc.

W ten sposób poprawiłem swój problem.

+8

Dziękuję, to zadziałało dla mnie! W rzeczywistości, po prostu potrzebne do dodania konfiguracji Gradle (używam także 1.5), nawet nie musiałem dodawać ColorControlNormal. – henry000

+1

działa bez użycia "colorControlNormal" :) ty -> do góry –

4

Miałem ten problem podczas zmiany biblioteki wsparcia na 23.2.0. Ikony strzałki i przepełnienia wstecz zmieniły kolor na czarny.

protected void changeBackArrow() { 
    final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material); 
    upArrow.setColorFilter(ContextCompat.getColor(this, R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP); 

    getSupportActionBar().setHomeAsUpIndicator(upArrow); 
} 

Jako wsparcie 23,1 Toolbar ma teraz getOverflowIcon() i setOverflowIcon() metody

protected void changeOverflowMenu() { 
    final Drawable overflowIcon = getToolbar().getOverflowIcon(); 
    overflowIcon.setColorFilter(ContextCompat.getColor(this, R.color.colorWhite), PorterDuff.Mode.SRC_ATOP); 

    getToolbar().setOverflowIcon(overflowIcon); 
} 
+0

pracuję dla mnie .. –

7

Wystarczy zaktualizować do Support Library 23.2.1, która rozwiązuje ten problem.

Dla użytkowników AppCompat, flagi dla Włączanie obsługi kanału alfa wektorem opisanym w poście na blogu (http://goo.gl/073Mpo 23,2) nie są już potrzebne do wykorzystania AppCompat.

https://plus.google.com/+AndroidDevelopers/posts/BZgzpAqkd8G

+0

Jestem na 23.2.1 , ale wciąż mając problem – Bruce

+0

Fałszywy alarm, właśnie znalazłem to w mojej kompilacji.plik gradle wygenerowany przez kreatora Android Studio domyślnie używa 23.2.0 .. spróbuje dzięki! – Bruce

0

napisałem pomocnika (używam statyczną klasę pomocniczą z przydatnych funkcji) funkcję, która może zostać wywołana na początku onCreate() z działalności:

public static void setWhiteBackArrow(ActionBar actionbar, Context context){ 
    //needed due to bug in Android compile version 23 
    // https://code.google.com/p/android/issues/detail?id=201918 
    if (actionbar != null) { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
      final Drawable upArrow = ContextCompat.getDrawable(context, android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material); 
      upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP); 
      //ActionBar aBar = context.getSupportActionBar(); 
      actionbar.setHomeAsUpIndicator(upArrow); 
     } 
    }  

Nazwij to jak to w onCreate() działalności:

Helper.setWhiteBackArrow(getSupportActionBar(), this); 
3

piszę tę odpowiedź, ponieważ akceptowane odpowiedź nie działa dla mnie (nawet jeśli jest poprawna). Ale rozwiązałem go w inny sposób, więc udostępniam go tutaj:

Po pierwsze, nic nie dodałem do pliku gradle. Korzystam z biblioteki pomocy technicznej v23.4.0, ponieważ jest ona najnowsza w chwili pisania tego postu.

To, co zadziałało, to kodowanie odcień koloru lub ścieżki koloru, zamiast korzystania z odniesienia do zasobów kolorów. Na przykład, należy android:fillColor="#fff" zamiast android:fillColor="@android:color/white":

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:tint="#fff" 
    android:viewportHeight="24" 
    android:viewportWidth="24"> 
    <path 
     android:fillColor="#fff" 
     android:pathData="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" /> 
</vector> 

Należy odcień koloru, a ścieżka w powyższym fragmencie kodu. Wcześniej przypisywałem kolor jako "@color/someColor", ale wyświetlało się ostrzeżenie, że będzie działać tylko dla wersji 21 i nowszych, a faktycznie nie działało poniżej wersji 21. Więc zmieniłem to na wartość zakodowaną na stałe. Ponownie jest to proste rozwiązanie/hack i prawdopodobnie nie jest to poprawne rozwiązanie.