Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [android] dubbi sugli eventi

    ciao,
    posto solo una porzione di codice per porre una domanda: possibile che implementato un Button si deve lanciare la funzione che lo contiene?
    Quindi se implementassi 10 Button dovrei creare e lanciare 10 funzioni?

    Mi viene in mente Borland Builder dove gli eventi vengono gestiti a runtime senza la necessità di lanciare alcunchè.

    grazie

    codice:
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); pippo();new Thread(new ClientThread()).start(); } Button button; public void pippo() { try{ button = (Button) findViewById(R.id.button2); } catch(Exception e) {} button.setOnClickListener(new View.OnClickListener() { publicvoid onClick(View v) { // TODO Auto-generated method stub if(button.getText().toString() == "cip") button.setText("ciop"); else
    button.setText(
    "cip");}});
    }
    Ultima modifica di misterx; 10-02-2014 a 15:01

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non ho capito niente...
    Ad un pulsante va associato un OnClickListener (un ascoltatore di eventi "click", che verrà notificato quando, appunto, avviene un clic sul pulsante). L'OnClickListener poi farà quel che deve fare.
    Esattamente come in Java puro a ciascun pulsante va associato un ActionListener.

    Che poi vi sia un OnClickListener per ciascun pulsante o che ve ne sia uno solo per tutti, quello sta a te deciderlo.

    Tutti gli esempi che si trovano on-line e sulla documentazione mostrano codice che crea un OnClickListener (come inner anonymous class) diverso per ciascun pulsante, ma non è "la regola". Qui di seguito ti mostro altri due esempi, ciascuno con le proprie finalità i propri pro e contro:

    Caso 1: l'Activity (o, comunque, la classe che modella la pagina) è anche l'OnClickListener per il pulsante:

    codice:
    public class MyActivity implements OnClickListener {
       ...
       @Override
       public void onCreate(Bundle savedInstance) {
          ...
          Button b = (Button) findViewById(R.id.mioButton);
          b.setOnClickListener( this );
       }
    
       ...
       @Override
       public void onClick(View v) {
          ...   // fai quel che vuoi al clic sul pulsante "mioButton"
       }
    }

    Caso 2: L'OnClickListener è una classe separata e tutti i pulsanti condividono la stessa istanza

    codice:
    public class MyActivity {
    
       private class MioListener implements OnClickListener {
          @Override
          public void onClick(View v) {
             switch( v.getId() ) {
                case R.id.mioButton1:
                   ...   // fai qualcosa per il pulsante 1
                   break;
                case R.id.mioButton2:
                   ...   // fai qualcosa per il pulsante 2
                   break;
                ...
             }
          }
       }
    
       private MioListener listener;
       ...
       @Override
       public void onCreate(Bundle savedInstance) {
          listener = new MioListener();
          ...
          Button b1 = (Button) findViewById(R.id.mioButton1);
          b1.setOnClickListener( listener );
    
          Button b2 = (Button) findViewById(R.id.mioButton2);
          b2.setOnClickListener( listener );
       }
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie 1000 per gli esempi, chiedo venia per la poca chiarezza nella mia esposizione iniziale.

    Avevo trovato un esempio, forse anomalo, che ho trasformato in questo modo; da qui la domanda se all'esecuzione della app si deve necessariamente richiamare le due funzioni implementate da me; in caso contrario gli eventi non vengono gestiti.

    codice:
    public class MainActivity extends Activity {
    @Override
     public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
       
             salva();
             leggi();
       new Thread(new ClientThread()).start();         
     } 
     
     
     Button ButtonLeggi;
     Button ButtonSalva; 
     EditText ip, porta;
     
     public void salva() {
         try{
          ButtonSalva = (Button) findViewById(R.id.button2);
          porta = (EditText) findViewById(R.id.editText3);
          ip = (EditText) findViewById(R.id.editText2);
      } catch(Exception e) {}
         
       
       ButtonSalva.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                // TODO Auto-generated method stub        
           try {
         // codice per salvataggio
           } catch(Exception e) {}
            }
      }); 
     }
     
     public void leggi() {
      
         try{
          ButtonLeggi = (Button) findViewById(R.id.button3);
          porta = (EditText) findViewById(R.id.editText3);
          ip = (EditText) findViewById(R.id.editText2);
      } catch(Exception e) {}
         
       ButtonLeggi.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                // TODO Auto-generated method stub        
           try {
         // codice per lettura
           } catch(Exception e) {}
            }
      }); 
     }
     }

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Diciamo che non è il modo "corretto" di procedere.

    Il ciclo di vita della Activity (che deve esserti ben chiaro) dice che il metodo onCreate() è il primo ad essere eseguito. In questo metodo tu richiami, in sequenza, i metodi salva() e leggi() e poi fai partire un thread(cioè, appena la Activity viene creata tu chiami subito salva() e leggi(), uno dopo l'altro)... quello che fanno questi due metodi è una specie di "inizializzazione" dei pulsanti e delle EditText... tutte cose che possono tranquillamente essere fatte direttamente nel onCreate()... non ha nessun senso farle in due posti separati.

    Oltretutto, le EditText "porta" e "ip" vengono prima assegnate in salva() e poi ri-assegnate (di nuovo, per niente) in "leggi"... solo assegnate, senza che ci venga fatto alcunché con queste EditText.

    Lo schema generale vorrebbe che in "onCreate()" tu assegnassi tutto quello che serve all'activity per vivere. Quindi, prelievo delle EditText dal Layout e assegnazione ai due oggetti dell'activity e assegnazione di tutti i listener (i due listener per i pulsanti).

    Fine.

    Poi, ovviamente, quello che i Listener dovranno fare quando vengono invocati (ovvero, al clic sui pulsanti) va gestito... una cosa che si fa di solito è richiamare un metodo della Activity in risposta al clic, che farà qualcosa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie 1000


    Esiste un metodo banale per salvare ciò che è contenuto un un EditTex in formato testo e poi rileggerlo?

    Ho usato questo sistema ma quando rileggo ottengo dati sporchi

    codice:
         ButtonSalva.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                // TODO Auto-generated method stub
             
           try {
            //outputStream = openFileOutput("nrc.txt", Context.MODE_PRIVATE);
            BufferedWriter writer = new BufferedWriter(new FileWriter("test.txt"));
            string=porta.getText().toString();
            writer.write(string);
            string=ip.getText().toString();
            writer.write(string);
            writer.close();
           } catch(Exception e) {}
            }
      }); 
     
    
     ButtonLeggi.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                // TODO Auto-generated method stub
             
           try {
             inputStream = openFileInput("test.txt");
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
             String c=null;
             c=reader.readLine();
             porta.setText(c);
             c=reader.readLine();
             ip.setText(c);
             inputStream.close();
           } catch(Exception e) {}
            }
      });
    
     
    

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    E' sbagliato il modo di scrivere i dati, rispetto alla lettura.
    Il metodo write() di BufferedWriter scrive i dati così come sono, mentre tu poi cerchi di leggerli come se fossero uno sotto l'altro (cioè, come se fossero uno per riga)... in realtà in questo modo:

    codice:
    String porta = "1234";
    String ip = "192.168.1.1";
    
    // Scrivo la porta
    writer.write( porta );
    
    // Scrivo l'IP
    writer.write( ip );

    Ottieni questo file:

    codice:
    1234192.168.1.1

    Cioè, i due dati sono attaccati uno dopo l'altro... quello che serve a te è un "a capo" tra il primo ed il secondo:


    codice:
    // Scrivo la porta
    writer.write( porta );
    
    // Vado a capo
    writer.newLine();
    
    // Scrivo l'IP
    writer.write( ip );
    
    // Faccio un flush
    writer.flush();

    Questo per essere coerenti con il codice che usi per leggere: readLine() legge una riga intera, quindi nel tuo caso stavi già leggendo IP e PORTA tutti attaccati con la prima lettura.

    PS: ricordati di effettuare sempre un flush() prima di chiudere l'output... nessuno ti garantisce che i dati siano stati effettivamente scritti! E non ammazzare le eccezioni!


    codice:
    try {
       ...
    } catch (Exception e) {
       Log.e("TuoTag", "Descrizione errore", e);
    }

    Ciao.
    Ultima modifica di LeleFT; 11-02-2014 a 17:23
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie come sempre, ho reso più chiaro il codice spezzando le parti; eseguendolo ottengo eccezioni.
    Trattandosi di Android, è colpa di qualche policy?

    codice:
         ButtonSalva.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
                // TODO Auto-generated method stub
             
           try {
            
            FileWriter w;
            w=new FileWriter("test.txt");
            BufferedWriter b;
            b=new BufferedWriter(w);
            
            b.write(ip.getText().toString());
            b.newLine();
            b.write(porta.getText().toString());
            b.flush();
            
            b.close();
           
           } catch(Exception e) {Log.e("salva", "Descrizione errore", e);}
            }
      });
    02-12 04:48:49.576: E/salva(1124): Descrizione errore
    02-12 04:48:49.576: E/salva(1124): java.io.FileNotFoundException: /test.txt: open failed: EROFS (Read-only file system)
    02-12 04:48:49.576: E/salva(1124): at libcore.io.IoBridge.open(IoBridge.java:409)
    02-12 04:48:49.576: E/salva(1124): at java.io.FileOutputStream.<init>(FileOutputStream.j ava:88)
    02-12 04:48:49.576: E/salva(1124): at java.io.FileOutputStream.<init>(FileOutputStream.j ava:73)
    02-12 04:48:49.576: E/salva(1124): at java.io.FileWriter.<init>(FileWriter.java:80)
    02-12 04:48:49.576: E/salva(1124): at com.example.prova_runnable.MainActivity$1.onClick( MainActivity.java:47)
    02-12 04:48:49.576: E/salva(1124): at android.view.View.performClick(View.java:4424)
    02-12 04:48:49.576: E/salva(1124): at android.view.View$PerformClick.run(View.java:18383 )
    02-12 04:48:49.576: E/salva(1124): at android.os.Handler.handleCallback(Handler.java:733 )
    02-12 04:48:49.576: E/salva(1124): at android.os.Handler.dispatchMessage(Handler.java:95 )
    02-12 04:48:49.576: E/salva(1124): at android.os.Looper.loop(Looper.java:137)
    02-12 04:48:49.576: E/salva(1124): at android.app.ActivityThread.main(ActivityThread.jav a:4998)
    02-12 04:48:49.576: E/salva(1124): at java.lang.reflect.Method.invokeNative(Native Method)
    02-12 04:48:49.576: E/salva(1124): at java.lang.reflect.Method.invoke(Method.java:515)
    02-12 04:48:49.576: E/salva(1124): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:777)
    02-12 04:48:49.576: E/salva(1124): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:593)
    02-12 04:48:49.576: E/salva(1124): at dalvik.system.NativeStart.main(Native Method)
    02-12 04:48:49.576: E/salva(1124): Caused by: libcore.io.ErrnoException: open failed: EROFS (Read-only file system)
    02-12 04:48:49.576: E/salva(1124): at libcore.io.Posix.open(Native Method)
    02-12 04:48:49.576: E/salva(1124): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110 )
    02-12 04:48:49.576: E/salva(1124): at libcore.io.IoBridge.open(IoBridge.java:393)
    02-12 04:48:49.576: E/salva(1124): ... 15 more
    Ultima modifica di misterx; 12-02-2014 a 11:56

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da misterx Visualizza il messaggio
    è colpa di qualche policy?

    Risposta: sì.

    02-12 04:48:49.576: E/salva(1124): java.io.FileNotFoundException: /test.txt: open failed: EROFS (Read-only file system)

    Hai aggiunto al manifest i permessi di scrittura?


    codice:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie per la risposta,
    si, avevo inserito quella policy, non sarà colpa dell'emulatore?

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Quote Originariamente inviata da misterx Visualizza il messaggio
    grazie per la risposta,
    si, avevo inserito quella policy, non sarà colpa dell'emulatore?

    credo di aver scoperto che la mia app cercava di scrivere nella root, aggiungendo

    String filePath = getFilesDir().getPath().toString() +"/test.txt";

    sembra funzionare in scrittura ma non in lettura


    p.s.
    credo di aver risolto in maniera anomala
    scrivo settando così
    String filePath = getFilesDir().getPath().toString() +"/test.txt";

    ma leggo settando così
    String filePath = "test.txt";

    altrimenti ho segnalazione di errore.

    Si direbbe che il comportamento predefinito è quello di scrivere nella root se non diversamente specificato e leggere nel percorso della app
    Ultima modifica di misterx; 13-02-2014 a 10:29

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.