2012-11-25 1 views
0

Je ne comprends pas complètement les fonctions de LayoutInflater, bien que je l'ai utilisé dans mes projets. Pour moi c'est juste un moyen de trouver la vue quand je ne peux pas appeler la méthode findViewById. Mais parfois, cela ne fonctionne pas comme je l'espère.Qu'est-ce qui est équivalent à findViewById en utilisant LayoutInflater dans Android?

J'ai cette mise en page très simple (main.xml)

<?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" 
       android:id="@+id/layout"> 
    <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Hello World, MyActivity" 
      android:id="@+id/txt"/> 

    <Button android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Change text" 
      android:id="@+id/btn"/> 
</LinearLayout> 


Ce que je veux est très simple - il suffit de changer le texte à l'intérieur TextView lorsque vous appuyez sur le bouton. Tout fonctionne bien comme ça

public class MyActivity extends Activity implements View.OnClickListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button btn = (Button) findViewById(R.id.btn); 
     btn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     TextView txt = (TextView) findViewById(R.id.txt); 
     double random = Math.random(); 
     txt.setText(String.valueOf(random)); 
    } 
} 

Mais je veux comprendre ce qui serait l'équivalent en utilisant LayoutInflater? J'ai essayé, mais sans succès, TextView n'a pas changé sa valeur

@Override 
public void onClick(View view) { 
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View main = inflater.inflate(R.layout.main, null); 
    TextView txt = (TextView) main.findViewById(R.id.txt); 
    double random = Math.random(); 
    txt.setText(String.valueOf(random)); 
} 

Mais quand je vois que le débogage chaque variable avec la valeur droite remplit. Je veux dire variable txt contient réellement TextView dont la valeur est "Hello World, MyActivity", et après la méthode setText il contient un certain nombre aléatoire, mais je ne pouvais pas voir ces changements sur l'interface utilisateur. C'est le problème principal que j'ai rencontré avec LayoutInflater dans mes projets - pour une raison quelconque, je ne peux pas mettre à jour les vues gonflées. Pourquoi?

Répondre

3

Pour moi c'est juste un moyen de trouver la vue lorsque je ne peux pas appeler la méthode findViewById .

Ceci est incorrect. Le LayoutInflater est utilisé pour gonfler (construire) une hiérarchie de vue à partir du fichier de disposition xml fourni. Avec votre deuxième fragment de code, vous construisez la hiérarchie de vue à partir du fichier de mise en page (R.layout.main), trouvez le TextView à partir de cette vue gonflée et définissez le texte dessus. Le problème est que cette vue gonflée n'est pas attachée à l'interface utilisateur visibile du Activity. Vous pouvez voir les changements, par exemple, si vous appelez à nouveau setContentView cette fois en lui donnant la vue gonflée. Cela rendra le contenu de votre Activity pour être le nouveau gonflé View:

LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View main = inflater.inflate(R.layout.main, null); 
TextView txt = (TextView) main.findViewById(R.id.txt); 
double random = Math.random(); 
txt.setText(String.valueOf(random)); 
setContentView(main); 
+0

Merci. Oui, je sais que j'ai tort, c'est pourquoi je pose cette question. Alors, est-il impossible de mettre à jour la vue avec LayoutInflater sans utiliser la méthode setContentView? –

+0

@VitaliiKorsakov Oui, c'est impossible. Le 'LayoutInflater' va créer de nouvelles vues avec la méthode' inflate', donc vous n'avez pas de "connections" (ou référence si vous préférez) aux anciennes vues qui sont déjà présentes dans la disposition de 'Activity'. – Luksprog

Questions connexes