Autore Topic: I bottoni non cambiano colore  (Letto 1031 volte)

Offline upitusu

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
I bottoni non cambiano colore
« il: 17 Novembre 2011, 11:32:39 CET »
0
Sono un programmatore che si è appena avvicinato al mondo "Android", stò sviluppando un' applicazione ma ho un problema in un determinato passaggio....mi spiego:
La mia applicazione è composta da 4 bottoni colorati(tutti diversi) che dopo aver premuto START si resettano diventando grigi. Il programma continua leggendo una sequenza di numeri ed in base a quale numero legge ricolora per un preve periodo di tempo il tasto assegnato. Il programma gira correttamente ma io non riesco a visualizzare il cambiamento di stato dei vari bottoni. L' ho testato con il debuger ed è tutto ok ma provandolo sul simulatore visualizza solo l'ultimo stato. Allego codice:
Codice (Java): [Seleziona]
public void generaColori(){
      int a[]={1,2,3,1};
      for(int x=0; x<a.length; x++){
        switch(a[x]){
          case 1:
            btnBlu.setBackgroundColor(android.graphics.Color.BLUE);
            for(int i=0;i<1000000;i++){}
            btnBlu.setBackgroundColor(android.graphics.Color.TRANSPARENT);
            break;
           
          case 2:
            btnVerde.setBackgroundColor(android.graphics.Color.GREEN);
            for(int i=0;i<1000000;i++){}
            btnVerde.setBackgroundColor(android.graphics.Color.TRANSPARENT);
            testoIni.setText("VERDE");
            break;
           
          case 3:
            btnGiallo.setBackgroundColor(android.graphics.Color.YELLOW);
            for(int i=0;i<1000000;i++){}
            btnGiallo.setBackgroundColor(android.graphics.Color.TRANSPARENT);
            testoIni.setText("GIALLO");
            break;
           
          case 4:
            btnRosso.setBackgroundColor(android.graphics.Color.RED);
            for(int i=0;i<1000000;i++){}
            btnRosso.setBackgroundColor(android.graphics.Color.TRANSPARENT);
            break;
           
      }
      }
    }
Ho già provato ad aumentare il tempo di attesa ma niente e come se mi facesse vedere tutto a esecuzione finita...........

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:I bottoni non cambiano colore
« Risposta #1 il: 17 Novembre 2011, 12:18:26 CET »
0
Credo di aver intuito cosa vuoi ottenere, ma in tutta sincerità, l'approccio che hai scelto non è corretto sia in termini di piattaforma android che in termini di programmazione in generale.

In termini di programmazione generale, implementare ritardi con cicli vuoti al giorno d'oggi non ha più senso per varie ragioni, non ultima il fatto che i compilatori moderni (probabilmente anche le virtual machine java) saltano direttamente questi cicli inutili, per ottimizzare il codice (probabilmente è per questo che vedi solo l'ultimo). Se vuoi implementare un ritardo, crea un timer, lancialo e gestisci l'evento timer-scaduto.

Nella piattaforma Android questo approccio è ancor più spinto. Tieni conto che come regola ferrea di Android, nel thread dell'interfaccia utente, non puoi eseguire codice che duri più di 5 secondi; se capita, l'applicazione viene chiusa. Questa regola indica la via da seguire per tutte quelle casistiche (come la tua) in cui ci sono ritardi (sia voluti che impliciti) da gestire: crea un timer, lancialo e gestisci l'evento timer-scaduto.

Il mio consiglio, è di ripensare il tutto in questa ottica.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline upitusu

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:I bottoni non cambiano colore
« Risposta #2 il: 17 Novembre 2011, 12:49:10 CET »
0
Grazie per la risposta bradipo,
I cicli for sono stati introdotti in un secondo momento per motivi di debug, infatti avevo già pensato alla classe timer. Del fatto che non si potesse far girare codice più lungo di 5 secondi nell' interfaccia utente non sapevo niente.

Ancora Grazie...rettifico e poi ti faccio sapere!!! :-)

Offline upitusu

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:I bottoni non cambiano colore
« Risposta #3 il: 17 Novembre 2011, 19:23:10 CET »
0
 :-( :-( :-( :-( :-(
Ho modificato il codice in modo tale che dopo OnClickListener venga chiamata una classe apposita per la modifica dei colori, ma appena interviene a modificare il colore del tasto l' applicazione si chiude. Il logCat mi da un NullPointerExcepion sulla funzione:
Codice (Java): [Seleziona]
btnBlu.setBackgroundColor(android.graphics.Color.BLUE);
Boooooooooh........ Stò impazzendo!!!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:I bottoni non cambiano colore
« Risposta #4 il: 17 Novembre 2011, 19:33:42 CET »
0
Posta la parte del LogCat dove spiega la causa dell'errore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:I bottoni non cambiano colore
« Risposta #5 il: 17 Novembre 2011, 23:14:14 CET »
+1
Ciao Upitusu,
in effetti come hanno già detto i più esperti è impensabile mettere dei cicli attivi per non far continuare un processo. Io ho provato a scriverti un metodo che spero faccia quel che cercavi. Ho usato Timer, TimerTask e un Handler.
Ho dichiarato nel main.xml un Button btnRosso che richiamo poi nell'onCreate.
Codice (Java): [Seleziona]
 public class ColorButtonActivity extends Activity {
        Button btnRosso = null;
       
          /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnRosso = (Button) findViewById(R.idButton.buttonRed);
        avviaRosso();
    }
   
    public void avviaRosso() {
        int ATTESA = 4000;
        btnRosso.setBackgroundColor(android.graphics.Color.RED);
        //      SLEEP ATTESA SECONDS HERE ...
        final Handler handler = new Handler();
        Timer t = new Timer();
        t.schedule(new TimerTask() {
            public void run() {
                    handler.post(new Runnable() {
                            public void run() {
                            btnRosso.setBackgroundColor(android.graphics.Color.TRANSPARENT);
                            }
                    });
            }
        }, ATTESA);
    }
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline upitusu

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:I bottoni non cambiano colore
« Risposta #6 il: 18 Novembre 2011, 09:58:39 CET »
0
LogCat
Codice (Java): [Seleziona]
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime  FATAL EXCEPTION: main
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime  java.lang.NullPointerException
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at Brain.apk.Gioco.generaColori(Gioco.java:42)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at Brain.apk.MainActivity$1.onClick(MainActivity.java:68)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.view.View.performClick(View.java:3460)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.view.View$PerformClick.run(View.java:13955)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.os.Handler.handleCallback(Handler.java:605)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:92)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.os.Looper.loop(Looper.java:137)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:4340)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:511)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08:55:09.726    651     Brain.apk       ERROR   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)

alexAndroid il codice che mi hai proposto genra un errore all' istruzione
Codice (Java): [Seleziona]
handler.post(new Runnable() {

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:I bottoni non cambiano colore
« Risposta #7 il: 18 Novembre 2011, 14:19:58 CET »
0
Prova a postare anche il codice che ti genera il nullexception.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:I bottoni non cambiano colore
« Risposta #8 il: 19 Novembre 2011, 17:18:43 CET »
0
Ciao upitusu,
ho creato appositamente un esempio per te. Funziona semplicemente copiando e incollando il codice. Non è proprio il massimo, nè quello che cerchi tu, ma un'idea potresti fartela.
Codice (Java): [Seleziona]
package mia.prova;
//Non tutti gli import sono indispensabili
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;

public class ColorButtonActivity extends Activity {
        private TextView txtStatus;  
        private RefreshHandler mRedrawHandler = new RefreshHandler();  
        Button btnBlu = null;
        Button btnGiallo = null;
        Button btnVerde = null;
        Button btnRosso = null;
       
        /* Creiamo una classe che estende handler, dove sovrascriviamo il metodo handleMessage, così
         * possiamo usare questo Handler per gestire i nostri messaggi.
         * Dichiariamo poi una funzione sleep per ritardare ogni esecuzione di questo Handler con la
         * funzione sendMessageDelayed.
         */

        class RefreshHandler extends Handler {  
            @Override  
            public void handleMessage(Message msg) {
                ColorButtonActivity.this.updateUI();
            }  
         
            public void sleep(long delayMillis) {  
              this.removeMessages(0);
              sendMessageDelayed(obtainMessage(0), delayMillis);
            }  
          };  
         
         /* Sul metodo updateUI puoi settare il tuo codice e chiamare mRedrawHandler.sleep(1000) per
          * ritardare il tuo messaggio in millisecondi. Poi però ricordati di chiamare il metodo nel tuo onCreate.
          */

          private void updateUI(){  
                    int currentInt = Integer.parseInt((String) txtStatus.getText()) + 1;
                    if (currentInt <= 5) {
                        mRedrawHandler.sleep(1000);
                        txtStatus.setText(String.valueOf(currentInt));
                        btnRosso.setBackgroundColor(android.graphics.Color.RED);
                    }
                    if(currentInt > 5 && currentInt <=10) {
                        btnRosso.setBackgroundColor(android.graphics.Color.TRANSPARENT);
                        mRedrawHandler.sleep(1000);
                        txtStatus.setText(String.valueOf(currentInt));
                        btnVerde.setBackgroundColor(android.graphics.Color.GREEN);
                    }
                  if(currentInt > 10 && currentInt <=15) {
                        btnVerde.setBackgroundColor(android.graphics.Color.TRANSPARENT);
                        mRedrawHandler.sleep(1000);
                        txtStatus.setText(String.valueOf(currentInt));
                        btnGiallo.setBackgroundColor(android.graphics.Color.YELLOW);
                    }
                 if(currentInt > 15 && currentInt <=20) {
                        btnGiallo.setBackgroundColor(android.graphics.Color.TRANSPARENT);
                        mRedrawHandler.sleep(1000);
                        txtStatus.setText(String.valueOf(currentInt));
                        btnBlu.setBackgroundColor(android.graphics.Color.BLUE);
                    }
                 if (currentInt == 21)
                         btnBlu.setBackgroundColor(android.graphics.Color.TRANSPARENT);
            }
               
          /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnBlu = (Button) findViewById(R.idButton.buttonBlue);
        btnGiallo = (Button) findViewById(R.idButton.buttonYellow);
        btnVerde = (Button) findViewById(R.idButton.buttonGreen);
        btnRosso = (Button) findViewById(R.idButton.buttonRed);
        this.txtStatus = (TextView) this.findViewById(R.idText.txtStatus);  
        updateUI();
    }

QUESTO E' IL MAIN.XML
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >
   
    <Button android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="BOTTON BLUE"
       android:id="@+idButton/buttonBlue" />
    <Button android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="BOTTON RED"
       android:id="@+idButton/buttonRed" />
    <Button android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="BOTTON GREEN"
       android:id="@+idButton/buttonGreen" />
    <Button android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="BOTTON YELLOW"
       android:id="@+idButton/buttonYellow" />
        <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id="@+idText/txtStatus" android:text="0"
       android:textSize="16dp" />
   
</LinearLayout>
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:I bottoni non cambiano colore
« Risposta #9 il: 22 Novembre 2011, 12:05:38 CET »
0
Hai risolto il problema upitusu?
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.