Ja, schon wieder: btn.setBackgroundColor()

  • 28 Antworten
  • Letztes Antwortdatum
raptus93

raptus93

Neues Mitglied
0
Hallo!

Entschuldigung erstmal, dass ich dieses 1000x diskutierte Thema anspreche, aber ich komme momentan nicht klar mit folgender Situation:
Ich will die Farbe von Buttons ändern (typisch quiz: grün wenn richtig, rot wenn falsch), aber es passiert nicht wie erwartet.
Habe jetzt schon viel gelesen, aber scheinbar macht es niemand so wie ich es vorhabe:

In der Activity steht folgende Anweisung (der Codeblock wird definitiv erreicht):
Code:
btnAnswerA.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
Folgendes steht in der R.color
Code:
public static final class color {
        public static final int answerCorrect=0x7f040001;
        public static final int answerDefault=0x7f040000;
        public static final int answerWrong=0x7f040002;
}
Ich habe das Gefühl, dass ich irgendwie direkt auf die colors.xml zugreifen muss! Ist das korrekt? Hier die .xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="answerDefault">#D8D8D8</color><!-- The default style of the Buttons in the quiz -->
    <color name="answerCorrect">#04B404</color><!-- The Button gets this Color, if the User chose the correct answer -->
    <color name="answerWrong">#B40404</color><!-- If the User chose the wrong Answer, the Button gets this color -->
</resources>
 
bist du 100% das der Punkt im Code erreicht wird, ich habe gerade mal die Buttonfarbe in einer App geändert und es funktioniert genau so.

ist in der Variablen btnAnswerA auch die richtige Referenz gespeichert?
 
Ja, ich habe Toasts direkt darunter gemacht:
Code:
if(correct)
{
btnAnswerA.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
Toast.makeText(getApplicationContext(), "A GREEN",Toast.LENGTH_SHORT).show();
}
die korrekt ausgegeben werden.

Die Buttonreferenzen werden im Datenfeld deklariert, und in der onCreate() zugewiesen (Standart also). Die btn.setText() funktionieren auch schon auf die Buttons, müssen also stimmen.

Danke schonmal für die Antwort!
 
Zuletzt bearbeitet:
Hier die visuelle Situation:
 

Anhänge

  • snipped.jpg
    snipped.jpg
    4,9 KB · Aufrufe: 220
funktioniert das ganze denn, wenn du die farbe direkt da hinschreibst?
also:
btnAnswerA.setBackgroundColor("04B404");

Ah gerade gesehen, das setBackgroundColor ja ein int verlangt
0x04B404

btnAnswerA.setBackgroundColor(0xFF04B404);

sollte eigentlich funktionieren.
 
Sekunde, ich probiere es grade aus.. hab mir grade meinen workspace zerschossen, musste ihn als neu aus git importieren und jetzt die ganzen uncomitted wiederholen.. Gleich fertig!
 
Okay, scheinbar weiß ich jetzt, woran der Befehl scheitert!
Ich habe den Buttons bereits im Vorfeld eine Farbe zugeordnet, und der Befehl überschreibt diese Farbe nicht..
kennt jemand die Lösung?!
 
Das müsste trotzdem gehen. Mit den Befehl ändere ich immer meine Backgroundfarbe. Wie hast du die erste Farbe zugewiesen? Im xml oder im Code?
 
Ja, die ints werden automatisch generiert... Clean Build und schon sind sie wieder anders? ;)
 
ja aber er soll ja nicht den Int aus der R.java sondern den Farbcode reinschreiben.
 
Die Werte in R.java sind gekapselt. Die Hex-Werte werden für das Datenmapping gebraucht. Wichtig sind nur die Keys (z.B. R.color.
answerCorrect), damit kann man auf die Werte in den Resourcen zugreifen.
Zum Thema Datenmapping: http://de.wikipedia.org/wiki/Datenmapping

@raptus93 der Code der ganzen Klasse würde echt helfen.
 
markus.tullius schrieb:
Das müsste trotzdem gehen. Mit den Befehl ändere ich immer meine Backgroundfarbe. Wie hast du die erste Farbe zugewiesen? Im xml oder im Code?

In der .xml

Der ursprüngliche Beitrag von 23:06 Uhr wurde um 23:09 Uhr ergänzt:

Code:
package quiz;

import quiz.QuizLogic;
import backend.Question;
import backend.Question.Answer;

import com.example.energyharvest.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.service.wallpaper.WallpaperService.Engine;
import android.support.v4.app.NavUtils;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class QuizGUI extends Activity implements OnClickListener{
    
    private TextView tvQuestion;
    private Button btnAnswerA;
    private Button btnAnswerB;
    private Button btnAnswerC;
    private Button btnAnswerD;
    private ProgressBar timePB;
    
    private QuizLogic logic;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        
        //Sets up the Views
        setupLayout();
        
        //Initializing the Logic
        logic = new QuizLogic();
        
        //register this as observer
        logic.registerGUI(this);
        
        //Get 10 Questions from the server
        logic.getQuestions();
        
        //Create the first Question
        showNextQuestion();
    }
    
    private void setupLayout(){
        
         //Initializing the textView and the buttons
        tvQuestion = (TextView) findViewById(R.id.question);
        btnAnswerA = (Button) findViewById(R.id.answerA);
        btnAnswerB = (Button) findViewById(R.id.answerB);
        btnAnswerC = (Button) findViewById(R.id.answerC);
        btnAnswerD = (Button) findViewById(R.id.answerD);
        timePB = (ProgressBar) findViewById(R.id.timeProgressBar);
        
        //Adding the Listener for the Answer-Buttons
        btnAnswerA.setOnClickListener(this);
        btnAnswerB.setOnClickListener(this);
        btnAnswerC.setOnClickListener(this);
        btnAnswerD.setOnClickListener(this);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            // This ID represents the Home or Up button. In the case of this
            // activity, the Up button is shown. Use NavUtils to allow users
            // to navigate up one level in the application structure. For
            // more details, see the Navigation pattern on Android Design:
            // http://developer.android.com/design/patterns/navigation.html#up-vs-back
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onClick(View v) {
        //Decision, what Button has been clicked
        Answer chosenAnswer = Answer.A;
        if (v == btnAnswerB){
            chosenAnswer = Answer.B;
        }
        else if (v == btnAnswerC){
            chosenAnswer = Answer.C;    
        }
        else if (v == btnAnswerD){
            chosenAnswer = Answer.D;
        }
        
        blockButtons();
        
        //Check the correctness at the server, highlight depending on the result
        if(logic.checkAnswer(chosenAnswer)){
            highlight(true, chosenAnswer);
        }
        else{
            highlight(false, chosenAnswer);
        }
        
        if(logic.getCurrentQuestion()<10){
            showNextQuestion();
        }
        else{
            //quit the quiz
            Toast.makeText(getApplicationContext(), "10 Questions are asked. Quit.", Toast.LENGTH_SHORT).show();
        }
        
        
    }
    /**
     * all buttons are blocked
     * this happens, after one answer is chosen
     */
    public void blockButtons(){
        btnAnswerA.setActivated(false);
        btnAnswerB.setActivated(false);
        btnAnswerC.setActivated(false);
        btnAnswerD.setActivated(false);
    }
    
    
    /**
     * the next question and the new answers are shown and
     * the buttons are enabled
     */
    public void showNextQuestion(){
        btnAnswerA.setBackgroundColor(this.getResources().getColor(R.color.answerDefault));
        btnAnswerB.setBackgroundColor(this.getResources().getColor(R.color.answerDefault));
        btnAnswerC.setBackgroundColor(this.getResources().getColor(R.color.answerDefault));
        btnAnswerD.setBackgroundColor(this.getResources().getColor(R.color.answerDefault));
        
        Question q = logic.nextQuestion();
        
        tvQuestion.setText(q.text);
        btnAnswerA.setText(q.answerA);
        btnAnswerB.setText(q.answerB);
        btnAnswerC.setText(q.answerC);
        btnAnswerD.setText(q.answerD);
        
        btnAnswerA.setActivated(true);
        btnAnswerB.setActivated(true);
        btnAnswerC.setActivated(true);
        btnAnswerD.setActivated(true);
    }
    
    public void update(){
        double tl = logic.getTimeLeft();
        timePB.setMax(100);
        int percent = (int) Math.round(100 * tl / 7);
        timePB.setProgress(percent);
    }
    
    /**
     * Highlights the chosen answer. Green if right, red otherwise.
     * @param correct is true, if the answer has been correct, otherwise it is false
     * @param chosenAnswer
     */
    public void highlight(boolean correct, Answer chosenAnswer) {
        if(chosenAnswer == Answer.A){
            if(correct){
                btnAnswerA.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
                Toast.makeText(getApplicationContext(), "A GREEN", Toast.LENGTH_SHORT).show();
            }
            else{
                btnAnswerA.setBackgroundColor(this.getResources().getColor(R.color.answerWrong));
                Toast.makeText(getApplicationContext(), "A RED", Toast.LENGTH_SHORT).show();
            }
        }
        if(chosenAnswer == Answer.B){
            if(correct){
                btnAnswerB.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
                Toast.makeText(getApplicationContext(), "B GREEN", Toast.LENGTH_SHORT).show();
            }
            else{
                btnAnswerB.setBackgroundColor(this.getResources().getColor(R.color.answerWrong));
                Toast.makeText(getApplicationContext(), "B RED", Toast.LENGTH_SHORT).show();
            }
        }
        if(chosenAnswer == Answer.C){
            if(correct){
                btnAnswerC.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
                Toast.makeText(getApplicationContext(), "C GREEN", Toast.LENGTH_SHORT).show();
            }
            else{
                btnAnswerC.setBackgroundColor(this.getResources().getColor(R.color.answerWrong));
                Toast.makeText(getApplicationContext(), "C RED", Toast.LENGTH_SHORT).show();
            }
        }
        if(chosenAnswer == Answer.D){
            if(correct){
                btnAnswerD.setBackgroundColor(this.getResources().getColor(R.color.answerCorrect));
                Toast.makeText(getApplicationContext(), "D GREEN", Toast.LENGTH_SHORT).show();
            }
            else{
                btnAnswerD.setBackgroundColor(this.getResources().getColor(R.color.answerWrong));
                Toast.makeText(getApplicationContext(), "D RED", Toast.LENGTH_SHORT).show();
            }    
        }
    }
    
    

}

nach dem highlighten dachte ich einfach blockierend zu programmieren, wie zB mit

Thread.sleep(1200);

denn es sind ja sowieso alle Buttons geblockt, und warum sollte ich dann nicht auch einfach 1200 millisekunden schlafen gehen,
um genau so lange die Farbe grün oder rot anzuzeigen, bis ich zur nächsten Frage switche.
 
Zuletzt bearbeitet:
setBackgroundColor nimmt keine resource ID als Parameter sondern direkt eine Farbe als int Wert.
Um es einfacher zu machen schreibt man aber den HexWert in der form 0xAARRGGBB
also Alpha für die transparenz und dann RGB für rot grün und blau.
 
Was wäre, wenn ich nicht die Wahl hätte, es direkt als 0xAARRGGBB reinzuschreiben? Sorry, aber mein Ehrgeiz verbietet es mir grade. Es ist doch viel sauberer so, und muss doch auch so möglich sein!!! Schließlich wird aus der R.color.answerCorrect auch nur ein int-Wert entnommen, oder?

Mir kommt grade der Gedanke, dass es daran scheitern könnte, dass die Buttons mit setActivated(false) verändert wurden, kann es sein, dass dadurch keine Änderung mit setBackgroundColor() möglich sind?


hier übrigens die xml meiner activity.
Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".QuizLogic" >

    <TextView
        android:id="@+id/question"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:gravity="center"
        android:text="@string/question"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ProgressBar
        android:id="@+id/timeProgressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:layout_weight="0.08" />

    <Button
        android:id="@+id/answerA"
        style="@color/answerDefault"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="@string/answerA" />

    <Button
        android:id="@+id/answerB"
        style="@color/answerDefault"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="@string/answerB" />

    <Button
        android:id="@+id/answerC"
        style="@color/answerDefault"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="@string/answerC" />

    <Button
        android:id="@+id/answerD"
        style="@color/answerDefault"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="@string/answerD" />

</LinearLayout>
 
Zuletzt bearbeitet:
Naja du könntest mal probieren ob es direkt geht.
Wenn ja weißt du es liegt an einem problem die Farben aus der xml zu lesen, wenn's direkt auch nicht geht, dann liegt es daran, dass dein button gerade keine farbe annehmen möchte.
 
Wo wir grade beim Thema testen sind, kennst du da ne gute Methode? Ich habe ein HTC desire und hab mir extra zum testen noch ein DesireHD angeschafft, aber ich kriege es trotz aufwändiger Treiberbeschaffung nicht hin, das Eclipse eins davon erkennt.
Jetzt teste ich mit diesen beschissenen Emulatoren, aber das raubt mir noch den letzten Nerv, das geht garnicht. Wie lange der immer braucht!:ohmy:
 
Unmittelbar nach der highlight () Methode rufst du die showNextQuestion() Methode auf, die die Farbe wieder auf default setzt.
 
kosmus schrieb:
Unmittelbar nach der highlight () Methode rufst du die showNextQuestion() Methode auf, die die Farbe wieder auf default setzt.
jap, aber wie schon erwähnt, will ich da den Thread nachher 1200 ms schlafen lassen. Ich habe es schon mit getestet, funktionierte auch nicht richtig mit Zeitverzögerung. Aus debugginggründen habe ich es dann wieder temporär rausgenommen..
 
Zurück
Oben Unten