2016-04-24 12 views
0

Ich arbeite an einer App und versuche, Button Hintergrundfarbe mit Klick zu aktualisieren. Was ich tun möchte ist,Android aktualisiert keine Schaltflächenhintergrundfarbe auf UI-Thread

1) Warten Sie 0,5 Sekunden, um zu überprüfen, ob die Antwort richtig ist oder nicht. Wenn die Antwort richtig ist, ändern Sie die Farbe der Schaltfläche in Grün, ändern Sie sie stattdessen in Rot.

2) Nach der Farbänderung der Taste warten Sie weitere 0,5 Sekunden und rufen dann eine Funktion auf, um die Frage zu aktualisieren.

Hier ist meine onClick Methode,

@Override 
    public void onClick(View v) { 

     if(totalQuestionsAsked <= 10){ 
      if(score >= 10) 
       score = 10; 

      //Setting up button and image 
      final Button btnOne = (Button)findViewById(R.id.btn_one); 
      final Button btnTwo = (Button)findViewById(R.id.btn_two); 
      final Button btnThree = (Button)findViewById(R.id.btn_three); 
      final Button btnFour = (Button)findViewById(R.id.btn_four); 
      final ImageView flagImg = (ImageView)findViewById(R.id.flag_img); 

      final JSONArray country = getFilesArray()[0]; 
      final JSONArray flag = getFilesArray()[1]; 

      final View view = v; 

      switch (v.getId()){ 
       case R.id.btn_one: 
        btnOne.setBackgroundColor(Color.parseColor("#00b0ff")); 
        break; 
       case R.id.btn_two: 
        btnTwo.setBackgroundColor(Color.parseColor("#00b0ff")); 
        break; 
       case R.id.btn_three: 
        btnThree.setBackgroundColor(Color.parseColor("#00b0ff")); 
        break; 
       case R.id.btn_four: 
        btnFour.setBackgroundColor(Color.parseColor("#00b0ff")); 
        break; 
      } 

      final Handler handler = new Handler(); 
      final Runnable runnerTwo = new Runnable() { 
       @Override 
       public void run() { 
        if(totalQuestionsAsked <= 10){ 

         createCountryElements(flag, country, btnOne, btnTwo, btnThree, btnFour, flagImg); 
        }else{ 
         Toast.makeText(MainActivity.this, "Your total score is: " + String.valueOf(score), 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
      }; 

      Runnable runnerOne = new Runnable() { 
       @Override 
       public void run() { 

        if(view.getTag().equals(flagImg.getTag())){ 
         score++; 

         switch (view.getId()){ 
          case R.id.btn_one: 
           setButtonGreen(R.id.btn_one); 
           break; 
          case R.id.btn_two: 
           setButtonGreen(R.id.btn_two); 
           break; 
          case R.id.btn_three: 
           setButtonGreen(R.id.btn_three); 
           break; 
          case R.id.btn_four: 
           setButtonGreen(R.id.btn_four); 
           break; 
         } 

        }else{ 

         switch (view.getId()){ 
          case R.id.btn_one: 
           setButtonRed(R.id.btn_one); 
           break; 
          case R.id.btn_two: 
           setButtonRed(R.id.btn_two); 
           break; 
          case R.id.btn_three: 
           setButtonRed(R.id.btn_three); 
           break; 
          case R.id.btn_four: 
           setButtonRed(R.id.btn_four); 
           break; 
         } 
        } 
        totalQuestionsAsked++; 

        handler.postDelayed(runnerTwo, 1000); 

       } 
      }; 


      handler.postDelayed(runnerOne, 500); 


     } 

    } 

So ist es einfach nicht zu ändern Hintergrundfarbe der Schaltfläche. Alles andere funktioniert einwandfrei. Kann mir jemand sagen, wo ist mein Fehler?

Vielen Dank für Ihre Hilfe. : D

+0

Was kann ich an einem kurzen Blick auf Ihren Code erkennen, wenn Sie die Farbe im UI-Thread ändern? Sie können also die Farbwechselcodes in 'runOnUIThread {}' Block –

+0

@ReazMurshed verschieben. Zuerst ändere ich also die Farbe der ausgewählten Schaltfläche. Dann möchte ich für 0,5 Sekunden warten, um zu überprüfen, ob die gewählte Taste richtig war oder nicht, und die Farbe entsprechend ändern. Und dann nach 0,5 Sekunden die Frage aktualisieren. Das möchte ich tun. –

+0

Die Fälle im Switch werden nie aufgerufen. Weil die Ansichtsansicht = v die Ansicht ist, die das OnClickEvent abfängt. Und die Schaltflächen, die Sie in der Umschaltschleife bereitstellen, haben keinen OnClickListener. Ich weiß nicht, ob du verstanden hast, was ich meine. – ErenisR

Antwort

0
btnOne.setBackgroundColor(#00b0ff); 

den Trick tun wird;)

+0

Es hat nicht funktioniert. Ich habe das zuerst versucht. –

+0

Sind Sie sicher, dass die Methode aufgerufen wird? Können Sie gleichzeitig ein 'Log' drucken? –

+0

Ich änderte zurück zu Ihrer gegebenen Antwort und der gleichen Sache. Nichts passiert. Ich meine, es ändert sich nicht in rot oder grün. –

0

fand ich den Fehler, es funktioniert nicht, weil ich es nicht zu Grün zu ändern bin. Es funktioniert also einfach nicht auf andere Farben zu wechseln. Danke Ihnen allen, dass Sie mir geholfen haben. : D

+0

Ein bisschen Beratung, SO ist keine Anlaufstelle für Tippfehler, Fehler im Code. Also, wenn etwas nicht funktioniert, nicht zu SO weglaufen, um eine Frage zu stellen "Warum funktioniert dieser Code nicht". Tief durchatmen, entspannen, einen Schritt vom Computer wegtreten, recherchieren. – t0mm13b

+0

Ich weiß @ t0mm13b. Es ist, als hätte ich versucht, es für drei Tage zu reparieren, und ich habe den dümmsten Fehler nicht bemerkt. :( –

Verwandte Themen