2016-12-14 3 views
3

Я использую библиотеку поддержки Android и, кроме того, ограниченное количество виджетов, которые имеют оттенок с цветом accentColor, определенным в теме. Я хотел бы подкрасить некоторые другие чертежи, которые я использую в своем приложении. Я делаю это с помощью этого кода:Как исправить спорадические вытягиваемые оттенки?

public class ActivityTest extends AppCompatActivity { 

    protected void tintDrawable(int color, int drawableId) { 
     Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(this, drawableId)); 
     DrawableCompat.setTint(drawable, color); 
    } 

    protected void tintDrawables() { 
     int colorPrimary = getColorFromAttributeId(this, R.attr.colorPrimary); 
     tintDrawable(colorPrimary, R.drawable.drawable_1); 
     tintDrawable(colorPrimary, R.drawable.drawable_2); 
     tintDrawable(colorPrimary, R.drawable.drawable_3); 
     tintDrawable(colorPrimary, R.drawable.drawable_4); 
     tintDrawable(colorPrimary, R.drawable.drawable_5); 
     tintDrawable(colorPrimary, R.drawable.drawable_6); 
    } 


    public static int getColorFromAttributeId(Context context, int resourceAttributeId) { 
     int[] attributes = new int[] { resourceAttributeId }; 
     TypedArray typedArray = context.obtainStyledAttributes(attributes);  
     int color = typedArray.getColor(0, Color.TRANSPARENT); 
     typedArray.recycle(); 
     return color; 
    } 

    protected void doSetPreferencedThemeOnCreateSetContentView(Bundle savedInstanceState, int layoutResourceId) { 
     /* Catch 22: 
     * This order must be used otherwise an exception is thrown or theme is not applied. 
     * 1. setTheme() 
     * 1.b tintDrawables only after the theme is known we can get the color 
     * 2. onCreate() 
     * 3. setContentView()  * 
     * 4. setSupportActionBar() */ 
     // Apply theme. This must be done before super.onCreate() 
     setTheme(R.style.Theme_Custom_Theme); // in real case theme is retrieved from preferences 
     tintDrawables(); 
     super.onCreate(savedInstanceState); 
     setContentView(layoutResourceId); 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     doSetPreferencedThemeOnCreateSetContentView(savedInstanceState, R.layout.activity_test); 
    } 

} 

Это выглядит сложным, но это легко понять. Проблема в том, что мои чертежи тонированы «случайно». Некоторые из них, а некоторые нет и сохраняют цвет, как установлено в оригинальном png. Хуже того, если я покину деятельность и вернусь, результат может быть другим. Там может быть больше рисунков, тонированных правильно или меньше. Я полагаю, что тонирование является асинхронным, а макет создается до тех пор, пока оттенок не будет применен ко всем чертежам. Но это всего лишь предположение. Эта проблема раздражает, так как мой пользовательский интерфейс зависит от правильной тонировки, белые значки на белом фоне не очень полезны. Ни черные, ни черные. Как обеспечить правильную окраску чертежей?

+0

Есть ли у вас сведения? Скорее всего, это еще одна ошибка для Android. – f470071

ответ

0

Я знаю, что это старый, но я столкнулся с той же проблемой. Вызов метода mutate() на drawable гарантирует, что он не будет делиться своим состоянием с любым другим ресурсом. Из документов:

«По умолчанию всех вводимых коэффициента экземпляры, загруженные из одной и тех же долей ресурсов общего состояния, при изменении состояния одного экземпляра, все остальные экземпляры будут получать такую ​​же модификацию»

в мае случай, это вызывало случайные проблемы с тонировкой.