Autore Topic: Cambiare valore ad array di TextView  (Letto 943 volte)

Offline akus85

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • akus85
    • Mostra profilo
    • BitOverflow.it
  • Dispositivo Android:
    Galaxy Nexus S
  • Play Store ID:
    akus.py
  • Sistema operativo:
    Mac OS
Cambiare valore ad array di TextView
« il: 21 Gennaio 2011, 16:05:28 CET »
0
Ciao a tutti ho una view con 3 TextView ed un bottone, alla pressione del bottone devo cambiare il testo in tutte e tre le TextView però voglio gestirle tramite un'array di TextView.
Il problema è che ottengo un NullPointerException....  ???

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">

    <TextView android:text="Testo 1"
             android:id="@+id/TextView01"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"></TextView>
             
    <TextView android:text="Testo 2"
             android:id="@+id/TextView02"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"></TextView>
             
    <TextView android:text="Testo 3"
             android:id="@+id/TextView03"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"></TextView>
             
    <Button android:text="Press"
           android:id="@+id/Button01"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"></Button>
</LinearLayout>

main.java
Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;

public class main extends Activity {
    /** Called when the activity is first created. */
        private TextView txt1;
        private TextView txt2;
        private TextView txt3;
       
        private TextView[] txt = {txt1,txt2,txt3};
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        txt1 = (TextView) findViewById(R.id.TextView01);
        txt2 = (TextView) findViewById(R.id.TextView02);
        txt3 = (TextView) findViewById(R.id.TextView03);
       
        Button btn = (Button) findViewById(R.id.Button01);
        btn.setOnClickListener(new OnClickListener(){
               
                        @Override
                        public void onClick(View v) {
                                Modify("Ho cambiato il testo");
                               
                        }
                });
       
    }
   
    private void Modify(String s){
        for (int i=0;i<3;i++){
                txt[i].setText(s);
        }
    }
}

Logcat:
Codice: [Seleziona]
01-21 16:00:48.184: ERROR/AndroidRuntime(667): FATAL EXCEPTION: main
01-21 16:00:48.184: ERROR/AndroidRuntime(667): java.lang.NullPointerException
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at it.Forum.main.Modify(main.java:41)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at it.Forum.main.access$0(main.java:39)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at it.Forum.main$1.onClick(main.java:32)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.view.View.performClick(View.java:2408)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.view.View$PerformClick.run(View.java:8816)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.os.Handler.handleCallback(Handler.java:587)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.os.Looper.loop(Looper.java:123)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at java.lang.reflect.Method.invokeNative(Native Method)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at java.lang.reflect.Method.invoke(Method.java:521)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-21 16:00:48.184: ERROR/AndroidRuntime(667):     at dalvik.system.NativeStart.main(Native Method)


Dove sbaglio ?!?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Cambiare valore ad array di TextView
« Risposta #1 il: 21 Gennaio 2011, 16:23:55 CET »
0
qui:
        private TextView[] txt = {txt1,txt2,txt3};


dopo che hai preso le tv con findViewBy id fai:
txt = {tx1,tx2,tx3};
secondo me va
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline akus85

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • akus85
    • Mostra profilo
    • BitOverflow.it
  • Dispositivo Android:
    Galaxy Nexus S
  • Play Store ID:
    akus.py
  • Sistema operativo:
    Mac OS
Re:Cambiare valore ad array di TextView
« Risposta #2 il: 21 Gennaio 2011, 16:45:34 CET »
0
se dopo il findViewById metto :
 private TextView[] txt = {txt1,txt2,txt3};
mi fa togliere il private ed in pratica è come se la definisco locale...

Ho provato anche a dichiarare a livello di classe private TextView[] txt; e dopo i findViewById txt = {txt1,txt2,txt3}; ma Eclipse mi restituisce quest'errore :

Array constants can only be used in initializers
 ???


Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Cambiare valore ad array di TextView
« Risposta #3 il: 21 Gennaio 2011, 17:17:42 CET »
+1
allora prova a fare un'arraylist e dopo fai arraylist.add(txv1)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline akus85

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • akus85
    • Mostra profilo
    • BitOverflow.it
  • Dispositivo Android:
    Galaxy Nexus S
  • Play Store ID:
    akus.py
  • Sistema operativo:
    Mac OS
Re:Cambiare valore ad array di TextView
« Risposta #4 il: 21 Gennaio 2011, 17:31:30 CET »
0
Ottimo con l'arraylist funziona perfettamente!  ;-)
Grazie Nicola_D  :D

Sarebbe anche interessante capire perchè non funziona con l'array di TextView...

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Cambiare valore ad array di TextView
« Risposta #5 il: 21 Gennaio 2011, 17:37:07 CET »
0
è perchè tu lo inizializzi all'inizio, prima dell'oncreate,quando txt1 ecc sono a null.
poi dopo te referenzi txt1 ma non quello all'interno dell'array (che è una copia e non un riferimento).
Se tu aggiungiessi dinamicamente le tv all'array (del tipo array[0]=txt1) funzionerebbe.
é che non mi ricordo mai come si inizializza l'array senza dargli i valori e non avendo eclipse non potevo provare!
dovrebbe essere tipo array = new TextView[]{txt1,txt2,tx3}; ma non sono sicuro funzioni
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia