Android Studio устанавливает цвет фона на кнопку ничего не делает - PullRequest
0 голосов
/ 26 марта 2019

Я делаю приложение для Android, в котором есть какая-то кнопка. Идея заключается в создании теста с вопросом над кнопкой и возможным ответом на кнопки.

Я пытался раскрасить эти кнопки из потока, который не является потоком пользовательского интерфейса, и окраска неэффективна, но программа не выдает никакой ошибки. И это то же самое, запустив поток пользовательского интерфейса.

public void discoverAnswer(final String rep){
        this.sleeping = true;
        Log.d(TAG, "discoverReponse: step1");
        btn1.setBackgroundColor(btn1.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
        btn2.setBackgroundColor(btn2.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
        btn3.setBackgroundColor(btn3.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
        btn4.setBackgroundColor(btn4.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
        Log.d(TAG, "discoverReponse step2");
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "discoverReponse: step3");
                btn1.setBackgroundColor(btn1.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
                btn2.setBackgroundColor(btn2.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
                btn3.setBackgroundColor(btn3.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
                btn4.setBackgroundColor(btn4.getText().toString().equals(rep) ? Color.GREEN:Color.RED);
                Log.d(TAG, "discoverReponse step4");     
            }
        });
    }

На данный момент я получил все ожидаемые результаты (шаги 1-4), но кнопка не стала ни красной, ни зеленой.

1 Ответ

0 голосов
/ 26 марта 2019

ОК, так что пошагово. Имея этот макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="aaaa" />

    <Button
        android:id="@+id/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="bbbb" />

    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="cccc" />

    <Button
        android:id="@+id/button_4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="dddd" />

</LinearLayout>

которые выглядят так:

before click

Вы можете создать простую логику:

package training.com.myapplication;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    // All of your buttons
    Button btn1;
    Button btn2;
    Button btn3;
    Button btn4;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // "Find" buttons in layout
        btn1 = findViewById(R.id.button_1);
        btn2 = findViewById(R.id.button_2);
        btn3 = findViewById(R.id.button_3);
        btn4 = findViewById(R.id.button_4);

        // your correct response
        String response = "aaaa";

        // Adding listeners to all of buttons
        btn1.setOnClickListener(v -> {
            discoverAnswer(response);
        });

        btn2.setOnClickListener(v -> {
            discoverAnswer(response);
        });

        btn3.setOnClickListener(v -> {
            discoverAnswer(response);
        });

        btn4.setOnClickListener(v -> {
            discoverAnswer(response);
        });
    }

    public void discoverAnswer(final String rep) {
        // Change color all of the buttons
        runOnUiThread(() -> {
            btn1.setBackgroundColor(btn1.getText().toString().equals(rep) ? Color.GREEN : Color.RED);
            btn2.setBackgroundColor(btn2.getText().toString().equals(rep) ? Color.GREEN : Color.RED);
            btn3.setBackgroundColor(btn3.getText().toString().equals(rep) ? Color.GREEN : Color.RED);
            btn4.setBackgroundColor(btn4.getText().toString().equals(rep) ? Color.GREEN : Color.RED);
        });
    }
}

Или используя список Button s:

package training.com.myapplication;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    // List of buttons
    List<Button> listOfButtons = new ArrayList<>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listOfButtons.addAll(Arrays.asList(
                findViewById(R.id.button_1),
                findViewById(R.id.button_2),
                findViewById(R.id.button_3),
                findViewById(R.id.button_4)
        ));

        // your correct response
        String response = "aaaa";

        // Adding listeners to all of buttons - for API < 24
        for (Button button : listOfButtons) {
            button.setOnClickListener(v -> discoverAnswer(response));
        }
    }

    public void discoverAnswer(final String rep) {
        // Change color all of the buttons
        runOnUiThread(() -> {
            for (Button button : listOfButtons) {
                button.setBackgroundColor(button.getText().toString().equals(rep) ? Color.GREEN : Color.RED);
            }
        });
    }
}

И после нажатия на кнопку вы можете ожидать, что:

  • правильный - будет зеленым

  • остальные из них - красные

after click

...