Установка Custom-Theme для Button-Background программно - PullRequest
0 голосов
/ 30 января 2020

Я создал несколько пользовательских тем, которые помогают мне настраивать макеты в соответствии с предпочтениями пользователя. В моем приложении (Quiz-App) я меняю цвет кнопки, если это был правильный ответ. После этого я показываю диалог «correctAnswer» с onClick, где кнопки должны быть сброшены и снова получить свой нормальный цвет. Но так как я использую пользовательские темы, я не могу этого достичь. Любая помощь приветствуется!

Моя тема. xml:

    <style name="Theme.Custom1" parent="Theme.AppCompat.NoActionBar">
        <item name="background">@color/Red</item>
        <item name="arrow">@color/RedDark</item>
        <item name="toolbar">@color/RedDark</item>
        <item name="text">@color/Gold</item>
        <item name="button">@drawable/button_custom1</item>
    </style>

Мой макет. xml, где пользовательская тема назначается первой:

        <Button
            android:id="@+id/buttonA2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="9dp"
            android:layout_marginLeft="9dp"
            android:layout_marginEnd="9dp"
            android:layout_marginRight="9dp"
            android:layout_marginBottom="16dp"
            **android:background="?button"**
            android:onClick="buttonA2"
            android:textColor="@color/white"
            app:layout_constraintBottom_toTopOf="@+id/buttonB2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

Код, в котором я меняю цвет на зеленый и диалог для сброса:

    public void buttonA2(View view) {
        if (currentQuestion.getOptb().equals(currentQuestion.getAnswer())) {
            **buttonA2.setBackground(getResources().getDrawable(R.drawable.button_correct));**
            if (qid < list.size() - 1) {
                disableButton();
                **correctDialog();**
            } else {
                gameWon();
            }
        } else {
            gameLostPlayAgain();
        }
    }

resetColor () вызывается в correctDialog:

    public void resetColor() {
        buttonA2.setBackground(getResources().getDrawable(R.drawable.button_custom));
        buttonB2.setBackground(getResources().getDrawable(R.drawable.button_custom));
        buttonC2.setBackground(getResources().getDrawable(R.drawable.button_custom));
        buttonD2.setBackground(getResources().getDrawable(R.drawable.button_custom));
    }

Этот resetColor работал до того, как я начал использовать пользовательские темы .. теперь у меня есть 4 различные темы, установленные в настройках пользователей, и не только одна рисуемая кнопка "button_custom", но и 4 из них (button_custom1 до 4). Короче говоря: в resetColor мне нужно знать, какая пользовательская тема использовалась на кнопке, прежде чем я изменил цвет на зеленый и снова установил фон для этой пользовательской темы (например, рисовать внутри пользовательской темы).

Большое спасибо заранее!

РЕДАКТИРОВАТЬ: Я уже пробовал некоторые вещи, как это без какого-либо полезного результата:

Drawable buttonBack = buttonA2.getBackground();
String buttonBackground = buttonBack.toString();
System.out.println(buttonBackground);
int i = getResources().getIdentifier("tb.quiz:drawable/" + buttonBackground, null, null);
System.out.println(i);
buttonA2.setBackground(getResources().getDrawable(i));

Еще одна попытка была с Resources.Theme buttonBack = this.getTheme(); вместо Drawable buttonBack

1 Ответ

0 голосов
/ 31 января 2020

В случае, если кто-то сталкивается с той же проблемой, я нашел другой вопрос, который дал мне подсказку: { ссылка }

Использование typeArry buttonDraw Я сохранил тему кнопки по умолчанию в onCreate -> buttonDraw = getTheme().obtainStyledAttributes(new int[]{R.attr.button});

затем изменил мой resetColor() на:

buttonA2.setBackground(getResources().getDrawable(buttonDraw.getResourceId(0, 1)));
buttonB2.setBackground(getResources().getDrawable(buttonDraw.getResourceId(0, 1)));
buttonC2.setBackground(getResources().getDrawable(buttonDraw.getResourceId(0, 1)));
buttonD2.setBackground(getResources().getDrawable(buttonDraw.getResourceId(0, 1)));

Не знаю, самый ли это умный способ, но он сработал для меня.

Ура!

...