Я хочу запустить приведенный ниже код, чтобы подкрасить кнопку, которую можно рисовать на устройствах pre-lollipop, однако button.getCompoundDrawables () возвращает null для всех 4 элементов массива при вызове внутри метода onCreateView фрагмента.

Если я проверю тот же самый массив Drawable [] в более поздний момент времени - скажем, при нажатии кнопки - я могу увидеть, что значение drawable было правильно назначено (3 - пустые, 1 - действительное).

Есть ли жизненный цикл кнопки или жизненный цикл фрагмента, на который я могу положиться, если составной массив чертежей уже правильно инициализирован?

Drawable[] drawables = button.getCompoundDrawables();
        if( drawables[2] != null){
            Drawable wrapDrawable = DrawableCompat.wrap(drawables[2]);
            DrawableCompat.setTint(wrapDrawable, color);
            button.invalidate();
        }

Вот версии библиотеки, которые я использую:

compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:support-v4:24.1.1'
compile 'com.android.support:design:24.2.0'

По запросу я также включаю некоторый xml-код:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout        xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
 [...]  >

<Button
    android:id="@+id/bt1"
    android:background="@android:color/transparent"
    android:textAppearance="@style/ConfigButtonTheme"
    android:text="Sincronizar Música"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:drawableEnd="@drawable/ic_chevron_right_white_24dp"
    android:textAlignment="textStart"
    android:layout_width="match_parent"
    android:layout_height="60dp" />

</LinearLayout>
13
Jay 5 Сен 2016 в 23:47

6 ответов

Лучший ответ

Измените android:drawableEnd на android:drawableRight. Не уверен, почему, но drawableEnd возвращает null в методе onCreate (), и drawableRight работает нормально.

29
heloisasim 9 Сен 2016 в 19:06

Я предполагаю, что чертеж еще не был создан / надут. Попробуйте поместить этот код в onActivityCreated, onStart или onResume во Фрагменте. Они расположены в том порядке, когда они будут вызываться в жизненном цикле, в идеале вы хотите сделать это как можно скорее.

0
CodyEngel 6 Сен 2016 в 01:31

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

 val textDrawable = resources.getDrawable(R.drawable.ic_arrow_upward_24dp, null)
 val color = ResourcesCompat.getColor(resources, R.color.colorAccent, null)
     textDrawable.setTint(color)

            //setCompoundDrawablesRelativeWithIntrinsicBounds(left, top, right, bottom)
     textView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, textDrawable, null, null)
0
Andre Haueisen 4 Май 2018 в 21:14

Для android:drawableRight следует использовать getCompoundDrawables(), а для android:drawableEnd следует использовать getCompoundDrawablesRelative().

getCompouundDrawablesRelative ()

41
Chandra Sekhar 17 Ноя 2017 в 06:36

Измените android:drawableEnd на android:drawableRight. Не знаю почему, но drawableEnd возвращает null в методе onCreate() и drawableRight работает нормально.

ИЛИ

Другой способ обойтись без изменения android:drawableEnd на android:drawableRight. Будет работать на 100%

Просто напишите свой код следующим образом:

onCreate(){
    //your all statement
    //at the end
    findViewById(android.R.id.content).post(new Runnable() {
   @Override
   public void run() {
     //write your code here you will get all the drawables
   }
   });
}
1
Gio 5 Апр 2019 в 12:50

Он не загружает ваши чертежи в TextView в начале. Вы должны использовать

TextView.post({ 
    // get your drawables here.
})

Эта функция для получения ваших чертежей при загрузке.

0
Licat Julius 14 Май 2019 в 02:40