2015-10-20 4 views
2

Cela démontre probablement le manque le plus épouvantable de compréhension du cycle de vie de l'activité, mais soyez sympathique. Je vais finalement vouloir appeler Activity B de Activity A un certain nombre de fois, en passant chaque fois un paramètre différent à Activity B qui est alors répondu à l'utilisateur et stocke/définit diverses variables publiques. Comme un précurseur à cela, je veux juste obtenir ma tête ronde comment Activity A voit le changement à une variable publique que Activity B a changé.Comment afficher un texte public dans l'activité A après qu'il a été modifié par l'activité B

J'ai trois classes très simples: Common.java qui contient les variables publiques, l'activité principale MainActivity.java et l'activité enfant Child.java. Il n'y a qu'une seule variable publique en ce moment; c'est la chaîne mess1 qui est initialisée à "***". Tout le code fait pour le moment quand mainbutton est cliqué dans MainActivity, il appelle Child. Dans Child, nous avons immédiatement défini mess1 sur "Child here", puis défini le texte sur ChildTextView sur mess1. En cliquant sur le bouton childbtn dans Child, nous finish() l'activité des enfants (et bien sûr le système nous ramène à MainActivity.

Lorsque cette application est exécutée, wee voir les trois étoiles affichées dans MainActivity. Quand mainbutton est pressé, nous allons .. Child et voir "Child here" affiché lorsque le childbtn est pressé, nous revenons à MainActivity MAIS, les trois étoiles sont toujours là même si nous savons avec certitude que mess1 détient maintenant "Child here"

Mes questions sont les suivantes: 1. Pourquoi, quand nous savoir mess1 a été modifié, est-ce que MainActivity affiche toujours "***" au retour de l'activité Child? 2. Que dois-je changer dans le code pour afficher "Child here"?

Des extraits de code pertinents suivent. Merci d'avance pour votre aide.

Common.java

public class Common 
{ 
    public static String mess1 = "***"; 
} 

MainActivity.java

public class MainActivity extends AppCompatActivity 
{ 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button mainbutton = (Button)findViewById(R.id.mainbutton); 
    TextView maintop = (TextView)findViewById(R.id.maintop); 

    mainbutton.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      startActivity(new Intent(MainActivity.this, Child.class)); 
     } 
    }); 

    maintop.setText(Common.mess1); 
} 

Child.java

public class Child extends AppCompatActivity 
{ 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_child); 

    TextView childtext = (TextView) findViewById(R.id.childtext); 
    final Button childbtn = (Button) findViewById(R.id.childbtn); 

    Common.mess1 = "Child here"; 
    childtext.setText(Common.mess1); 

    childbtn.setOnClickListener 
      (new View.OnClickListener() 
      {public void onClick(View v) 
       {finish(); 
       } 
      } 
      ); 
} 

Répondre

0

Vous devez définir le texte en onResume() de MainActivity. Lorsque vous revenez de Child.javaonResume() (et non onCreate()) est invoqué et, puisque le texte de maintop est défini dans onCerate() uniquement, rien ne le change au retour.

protected void onResume() { 
    super.onResume(); 

    maintop.setText(Common.mess1); 
} 

Référence: Activity Lifecycle et Implementing the lifecycle callbacks

+0

Merci, Onik. Cela a fait l'affaire! –

+1

Acceptation effectuée, Onik. Peut-être que vous pourriez aider avec mon prochain poste (juste posté maintenant), à savoir "Dans Android Studio, ne peut pas invoquer l'activité B de l'activité A plus d'une fois". –

2

vous avez probablement vous revenez sur l'historique de pile arrière et vous reprenez l'activité précédente qui a été placée dans un état en pause et donc onCreate n'est pas appelé mais onResume (de l'activité initiale) ..

En utilisant global state this way n'est pas conseillé mais cela devrait fonctionner si vous placez le code approprié dans la méthode onResume.

+0

Merci, biggerScala. –