Android按钮文字颜色不会改变

时间:2015-04-27 01:20:06

标签: java android

我正在开发一个有问题并回答选项的测验应用。单击错误的答案(按钮)时,该特定按钮的文本颜色将变为红色。但是,单击右键时,该特定按钮的文本颜色应变为绿色,等待一秒,然后转到下一个问题。

我花了几天的时间试图弄清楚它为什么不起作用,用谷歌搜索答案,但我仍然无法使其发挥作用。

我尝试过使用Handler和Runnables,但它仍无效。

我已发布以下活动的完整代码。

请帮忙!

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.question_layout);

    Intent i = getIntent();
    subject = (Subject) i.getSerializableExtra(Globals.SUBJECT);
    questions = subject.getQuestions();
    subjectId = subject.getSubjectId();
    appPreferences = new AppPreferences();

    livesLeft = 3;
    index = 0;
    maxQuestions = questions.size();
    maxIndex = maxQuestions - 1;

    progressBar = (ProgressBar) findViewById(R.id.progressBar);
    progressBar.setMax(maxQuestions);

    answer1 = (Button) findViewById(R.id.buttonAnswer1);
    answer2 = (Button) findViewById(R.id.buttonAnswer2);

    setQuestionsAndAnswers(index);

    TextView textView = (TextView) findViewById(R.id.textViewSubjectName);
    textView.setText(subject.getSubjectName());
}

private void setQuestionsAndAnswers(int index)
{
    currentQuestion = questions.get(index);

    // Set question
    TextView textViewQuestion = (TextView) findViewById(R.id.textViewQuestion);
    textViewQuestion.setText(currentQuestion.getQuestion());

    // Set correct answer
    correctAnswer = currentQuestion.getCorrectAnswer();
    sourceUrl = currentQuestion.getSourceUrl();
    sourceText = currentQuestion.getSourceText();

    // Set answer #1
    initializeButton(answer1, currentQuestion.getAnswer1());

    // Set answer #2
    initializeButton(answer2, currentQuestion.getAnswer2());
    // Set source
    TextView textViewSource = (TextView) findViewById(R.id.textViewSource);
    textViewSource.setText(sourceText);
    textViewSource.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

    textViewSource.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(sourceUrl));
            startActivity(browserIntent);
        }
    });

    // Update progress
    updateProgress(index);
}

private void initializeButton(Button button, String answer)
{
    button.setText(answer);
    button.setTextColor(Color.WHITE);
    button.setBackgroundColor(Color.TRANSPARENT);
    button.setEnabled(true);

    button.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            onClickContent(view);               
        }
    });
}

private void onClickContent(View view)
{
    Context context = getApplicationContext();
    final Button button = (Button) view;
    String answer = button.getText().toString();

    if (answer.equalsIgnoreCase(correctAnswer))
    {
        button.setTextColor(Color.GREEN);

        try
        {
            Thread.sleep(1000);
        } catch (InterruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (index == maxIndex)
        {
            appPreferences.editPreferences(context, Globals.PREFERENCE_KEY + subjectId, true);

            playSound(Globals.SOUND_QUIZ_COMPLETED);

            Toast toast = Toast.makeText(context, "Quiz \"" + subject.getSubjectName() + "\" finished",Toast.LENGTH_LONG);
            toast.show();
            finish();
        } else
        {
            playSound(Globals.SOUND_CORRECT_ANSER);

            // Go to next question
            index++;
            setQuestionsAndAnswers(index);
        }

    } else
    {
        if (livesLeft == 1)
        {
            playSound(Globals.SOUND_GAME_OVER);
            Toast toast = Toast.makeText(context, "Game over", Toast.LENGTH_LONG);
            toast.show();
            finish();
        } else
        {
            playSound(Globals.SOUND_WRONG_ANSWER);

            button.setTextColor(Color.RED);
            button.setEnabled(false);
            livesLeft--;
            TextView lives = (TextView) findViewById(R.id.textViewLives);
            lives.setText("Lives: " + livesLeft);
        }
    }
}

private void updateProgress(int progress)
{
    progressBar.setProgress(progress++);
}

private void playSound(int songId)
{
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), songId);
    mp.start();
}

2 个答案:

答案 0 :(得分:1)

这是我用于同一目的的。它应该工作......

button.setTextColor(Color.GREEN);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        // Reset Color if you want to...
        // Start new question here
    }
}, 1000);

答案 1 :(得分:1)

首先,你的案例中的Thread.sleep(1000);在MAIN线程上运行,导致MAIN线程休眠,不建议使用。

您可以view.postDelayed在延迟后加载下一个问题,

private void onClickContent(View view)
{
    Context context = getApplicationContext();
    final Button button = (Button) view;
    String answer = button.getText().toString();

    if (answer.equalsIgnoreCase(correctAnswer))
    {
        button.setTextColor(Color.GREEN);

        if (index == maxIndex)
        {
            appPreferences.editPreferences(context, Globals.PREFERENCE_KEY + subjectId, true);

            playSound(Globals.SOUND_QUIZ_COMPLETED);

            Toast toast = Toast.makeText(context, "Quiz \"" + subject.getSubjectName() + "\" finished",Toast.LENGTH_LONG);
            toast.show();
            finish();
        } else
        {
            playSound(Globals.SOUND_CORRECT_ANSER);

            // Go to next question
            index++;
            // Go to next question after 1000ms
            view.postDelayed(new Runnable() {
                public void run() {
                    setQuestionsAndAnswers(index);
                }
            }, 1000); //here delays 1000ms
        }

    } 
    ...
}