Autore Topic: Eventi personalizzati  (Letto 2527 volte)

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Eventi personalizzati
« il: 28 Febbraio 2011, 01:14:33 CET »
0
Ciao Ragazzi, sono un novello di android.
Scusate la domanda forse un pò banale, ma potreste spiegarmi come si genera un evento e come lo si gestisce? Avrei bisogno di un esempio di codice banalissimo, oppure una guida che spieghi come fare. Supponiamo che una variabile "a", ad un certo istante, cambi valore da 0 a 1. Io vorrei lanciare un evento quando "a" passa al valore 1. Molto semplice come concetto. Mi potete ai.utare? Grazie infinitamente!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #1 il: 28 Febbraio 2011, 08:49:00 CET »
0
Codice (Java): [Seleziona]
public Class Classe{


        private void MyListener mListener;
        private int myVar = 3;

        public void setOnChangeListener(MyListener myListener){
                mListener = myListener;
        }


        public void someMethod(){
                myVar = 4;
                if(mListener != null){
                        mListener.onChange(myVar);
        }


        public interface MyListener{
                public void onChange(int newValue);    
        }

}

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #2 il: 28 Febbraio 2011, 11:02:22 CET »
0
Grazie della risposta!! ma in pratica quella che mi hai scritto tu è la classe evento giusto? In questo modo il sistema sta ad ascoltare continuamente il valore della mia variabile? In pratica io so x certo che una variabile "a" appena schiaccio un bottone  fa questi salti di valore 0-1-2-3-4, appena arriva a 4 io devo lanciare un metodo. Quindi non sarebbe un sempilce if(a==4), altrimenti appena vede a=1,2,3, passa avanti e non fa nulla, invece a me servirebbe che stesse in ascolto. E' il metodo setOnchange che fa questo??Grazie!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #3 il: 28 Febbraio 2011, 11:07:05 CET »
0
No la tua classe che è interessata ad ascoltare questi cambiamenti deve semplicemente registrare un listener in questo modo:
Codice (Java): [Seleziona]
Classe c = new Classe();
c.setOnChangeListener(new MyListener(){

          public void onChange(int value){

                   if(value == 4)
                          //fai quello che devi
         
          }

});

Proprio come fai ad esempio quando registri un listener per un bottone.

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #4 il: 28 Febbraio 2011, 21:48:14 CET »
0
Ma la Classe MyListener la devo creare giusto?

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #5 il: 01 Marzo 2011, 00:20:22 CET »
0
Ragazzi non mi funge!! In pratica questa variabile varia, ma il sistema non sta in ascolto, se ad esempio voglio lanciare un metodo quando a==3 e "a" parte da 0, quando a = 3 non fa nulla!! Potete aiutarmi?

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #6 il: 01 Marzo 2011, 00:52:29 CET »
0
Forse non mi sono spiegato bene, in pratica io vorrei monitorare una variabile SEMPRE!! SArebbe possibile? In pratica sto impazzendo..XD. In ogni caso grazie!

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #7 il: 01 Marzo 2011, 02:23:01 CET »
0
Ecco il Main:
Codice (Java): [Seleziona]
package prove.testeventi;

import android.app.Activity;
import android.os.Bundle;

public class main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Evento c = new Evento();
        MyListener m = new Ascoltatore();
        c.setOnChangeListener(m);
        c.someMethod(3);

    }
}

L'interfaccia:
Codice (Java): [Seleziona]
package prove.testeventi;

public interface MyListener {
        public void onChange(int newValue);    
}

La Classe Evento:
Codice (Java): [Seleziona]
package prove.testeventi;

import android.util.Log;

public class Evento {
        private MyListener mListener;
       
        public void setOnChangeListener(MyListener myListener){
        mListener = myListener;
}

        public void someMethod(int myVar){
        if(mListener != null)
                mListener.onChange(myVar);
        else
                Log.i("INFO", "NULLO");
}


}

L'ascoltatore
Codice (Java): [Seleziona]
package prove.testeventi;

import android.util.Log;

public class Ascoltatore implements MyListener{
        @Override
        public void onChange(int newValue) {
                // TODO Auto-generated method stub
                if (newValue == 3)
                        Log.i("INFO", "FUNZIONA!");
        }
       
       
       
}

In pratica il codice funziona. Se passo 3 al metodo someMethod, tutto funziona alla grande, ma il problema è che la variabile passata a questo metodo cambia sempre e ogni qual volta passa da 3 deve dirmi che funziona tutto. ad esempio 1-2-3--->FUNZIONA; 4-5-6-3--->FUNZIONA;0-9-8-6-3--->FUNZIONA. Spero di non avervi rotto troppo le balls, ma ci sto impazzendo da un giorno e a mio parere non credo io abbia bisogno solo di un gestore degli eventi, ma di un qualcosa che monitora la variabile, il problema è che non so cosa.
Grazie Ancora!

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #8 il: 01 Marzo 2011, 15:24:38 CET »
0
Allora, dopo 10000 tentativi, sono arrivato alla conclusione che quello che mi serve non è un evento. Ad esempio quando premo un bottone, lancio un evento ok, ma lo faccio in quel preciso istante e non monitoro continuamente il bottone! Ecco, a me serve qualcosa che monitori continuamente la variabile e che quando questa sia uguale ad un certo valore si debba lanciare un evento, MA PRIMA DEVO MONITORARLA!!! Qualcuno sa come fare?

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:Eventi personalizzati
« Risposta #9 il: 01 Marzo 2011, 15:33:39 CET »
0
Te la butto là a grandi linee ed eventualmente approfondiamo: un thread che controlla la variabile tramite while

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #10 il: 01 Marzo 2011, 16:31:25 CET »
0
Questa era la soluzione più semplice ed immediata, infatti ci sono arrivato subito. Ma per questa non c'è bisogno di un thread, nel senso che posso farlo anche senza! Non saprei però se effetivamente con un thread le risorse occupate da un while (che sta sempre in ascolto) sarebbero minori.
Ecco un tipico esempio di WHILE :-)
Codice (Java): [Seleziona]
int x = wm.getWifiState();//è la variabile che voglio controllare;
                        if(x!=3){
                                while(x!=3){
                                        x = wm.getWifiState(); //fai lo scan della variabile fino a quando non è uguale a 3, quando esce dal while x sarà uguale a 3.
                                        }
                                stato_ATT_wifi.setText("Wi-Fi attivato");

Il problema è che volevo farlo in modo più elegante.. In effetti a me servirebbe solo sapere quando l'antenna wi-fi si è accesa del tutto, quindi potrei provare con gli intent broadcast, ma devo andarmi a vedere tutti i comandi, perchè ho iniziato da poco!

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:Eventi personalizzati
« Risposta #11 il: 01 Marzo 2011, 16:53:37 CET »
0
Il thread è più che altro per evitare che la tua classe si blocchi in attesa che la condizione si sia verificata, bisogna vedere come hai implementato il tutto.
Io in un mio progetto ho utilizzato il wifiManager, ma non mi sono curato di attendere l'effettiva attivazione del wifi, ma semplicemente:

Codice (Java): [Seleziona]
if (wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
        wifiManager.setWifiEnabled(true);

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #12 il: 01 Marzo 2011, 18:27:00 CET »
0
Ho fatto come mi dicevi!! Ti ringrazio, sembra funzionare perfettamente!!! l'evento non mi serviva a una mazza!!XD. In ogni caso, sapere che l'antenna è attiva mi serve per fare la scansione delle reti disponibili. L'antenna come saprai non si accende di botto, ma segue più stadi e fino a quando non è pronta non la posso utilizzare. Cmq grazie 1000!

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:Eventi personalizzati
« Risposta #13 il: 01 Marzo 2011, 18:48:16 CET »
0
Si in effetti la scansione delle reti non è immediata infatti è qui che ti serve un BroadcastReceiver:

Codice (Java): [Seleziona]
                 WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

                 BroadcastReceiver bR = new BroadcastReceiver() {
                       
                        @Override
                        public void onReceive(Context context, Intent intent) {

                                List<ScanResult> results = wifiManager.getScanResults();

                                if (results != null) {

                                        for (ScanResult result : results) {
                                                // TODO
                                        }
                                }

                        }
                };

                registerReceiver(bR, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

Io ho risolto in questo modo :)

Offline Nicolò

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
Re:Eventi personalizzati
« Risposta #14 il: 02 Marzo 2011, 10:57:26 CET »
0
Beh, grazie ancora, mi è servito molto il tuo esempio sui broadcast receiver!! A quanto ho capito hai già esperienza in campo wifi su Android, quindi ti faccio un'altra domanda.
Quando registro un broadcast receiver come hai fatto tu, c'è bisogno che lo registro in qualche modo anche sull'android manifest?
E se ad esempio io non volessi che, nel momento in cui si accenda la rete wifi, ANDROID stesso scelga la rete alla quale connettersi, ma volessi scegliere le reti secondo il mio codice(quindi i miei criteri), si potrebbe fare? In pratica dovrei avere il comando io sull'applicazione e non il connection manager di android. Magari pensavo sempre agli intent broadcast: decido io di gestire un broadcast intent (come hai fatto tu nell'esempio) con un broadcast receiver di default, quindi (ad esempio) non appena accendo la rete e viene lanciato un broadcast intent, questo non viene più gestito da android, ma da me. Non so se funziona già cosi o diversamente, infatti lo chiedo a te! :-P