2012-03-20 7 views
3

J'ai un problème avec mon TextView. J'ai un PlayScreenActivity qui affiche des informations sur les fournitures. en haut de l'écran. Ensuite, je vais à l'écran du magasin et j'achète des fournitures. quand je reviens tous les autres changent mais 1 et il affichera la nouvelle valeur si je tourne mon téléphone et les changements d'orientation, c'est la seule façon que je peux voir les fournitures supplémentaires achetées. Quelqu'un at-il une idée pourquoi cela se passe-t-il?Problème avec TextView dans android

Je définis l'orientation de l'écran sur portrait pour voir si cela fonctionnera s'il ne peut pas changer mais ne corrige pas.

EDIT

Voici une copie de mon code d'activité:

PlayscreenActivity public class activité { données data_;

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((TextView)findViewById(R.id.lemonsLeftText)).setText(
      "Lemons: " ); 
    ((TextView)findViewById(R.id.sugarLeftText)).setText(
      "Sugar: " ); 
    ((TextView)findViewById(R.id.iceLeftText)).setText(
      "Ice: " );   
    ((TextView)findViewById(R.id.cupsLeftText)).setText(
      "Cups: " ); 
    ((Button)findViewById(R.id.btnshop)).setOnClickListener(
      new SupplyShopListener()); 
} 
private class SupplyShopListener implements OnClickListener{ 
     public void onClick(View v){ 
      Intent i = new Intent(v.getContext(), SupplyShopActivity.class); 
      startActivity(i); 
      //refreshDisplay(); 
     } 

}

@Override 
public void onResume(){ 
    super.onResume(); 
    data_ = getData(); 
    refreshDisplay(); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    saveData(); 
    refreshDisplay(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    //refreshDisplay(); 
} 

private Data getData() { 
    GameData player_data = new GameData(this); 
    player_data.open(); 
    Data game_state = new Data(player_data.getGameString()); 
    player_data.close(); 
    return game_state; 
    } 

private void saveData() { 
    GameData player_data = new GameData(this); 
    player_data.open(); 
    player_data.setGameString(data_.SerializeGame()); 
    player_data.close(); 

} 
private void refreshDisplay() { 

    NumberFormat nf = NumberFormat.getInstance(); 
    nf.setMinimumFractionDigits(2); 
    nf.setMaximumFractionDigits(2); 
    String totalCash = nf.format(data_.cash_); 

    ((TextView)findViewById(R.id.lemonsLeftText)).setText(
      "Lemons: " + Integer.toString(data_.lemons_));   
    ((TextView)findViewById(R.id.sugarLeftText)).setText(
      "Sugar: " + Integer.toString(data_.sugar_)); 
    ((TextView)findViewById(R.id.iceLeftText)).setText(
      "Ice: " + Integer.toString(data_.ice_)); 
    ((TextView)findViewById(R.id.cupsLeftText)).setText(
      "Cups: " + Integer.toString(data_.cups_)); 
    ((TextView)findViewById(R.id.totalCashText)).setText(
      "Cash : " + (totalCash)); 

} 

}

Répondre

0

... il affiche la nouvelle valeur si je tourne mon téléphone et l'orientation des changements

Android va détruire et recréer l'activité lors des changements de configuration en temps courir se produisent. Il est logique que vos nouvelles variables sont en cours d'élaboration sur la rotation de l'écran, parce que l'activité est entièrement recréée:

http://developer.android.com/guide/topics/resources/runtime-changes.html

Si la plupart de vos widgets TextView actualisent lorsque votre PlayScreenActivity reprend, votre refreshDisplay() appel fonctionne (dans une certaine mesure). Quel widget ne redessine pas? Je voudrais aussi jeter un coup d'oeil et regarder le LogCat comme zapl suggéré.

EDIT

Exemple de code avec une exploitation forestière (je déplacé les widgets dans les champs ...)

public class PlayscreenActivity extends Activity 
{ 
    Data data_; 

    String TAG = "PlayScreenActivity"; 

    TextView lemonsLeftTextLabel; 
    TextView sugarLeftTextLabel; 
    TextView iceLeftLabel; 
    TextView cupsLeftTextLabel; 
    TextView totalCashTextLabel; 
    Button shopButton; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "Creating PlayScreen activity..."); 
     setContentView(R.layout.main); 

     Log.d(TAG, "Assigning buttons..."); 
     lemonsLeftTextLabel = (TextView) findViewById(R.id.lemonsLeftText); 
     sugarLeftTextLabel = (TextView) findViewById(R.id.sugarLeftText); 
     iceLeftLabel = (TextView) findViewById(R.id.iceLeftText); 
     cupsLeftTextLabel = (TextView) findViewById(R.id.cupsLeftText); 
     totalCashTextLabel = (TextView) findViewById(R.id.totalCashText); 

     shopButton = (Button) findViewById(R.id.btnshop); 

     lemonsLeftTextLabel.setText("Lemons: "); 
     sugarLeftTextLabel.setText("Sugar: "); 
     iceLeftLabel.setText("Ice: "); 
     cupsLeftTextLabel.setText("Cups: "); 

     shopButton.setOnClickListener(new SupplyShopListener()); 
     Log.d(TAG, "onCreate() complete"); 
    } 
    private class SupplyShopListener implements View.OnClickListener { 
     public void onClick(View v){ 
      //Intent i = new Intent(v.getContext(), SupplyShopActivity.class); 
      //startActivity(i); 
      refreshDisplay(); 
     } 
    } 

    @Override 
    public void onResume(){ 
     Log.d(TAG, "onResume() called"); 
     super.onResume(); 
     data_ = getData(); 
     Log.d(TAG, "Data fetched"); 
     Log.d(TAG, "Contents of data = " + 
       "Lemons: " + Integer.toString(data_.lemons_) + " | " + 
       "Sugar: " + Integer.toString(data_.sugar_) + " | " + 
       "Ice: " + Integer.toString(data_.ice_) + " | " + 
       "Cups: " + Integer.toString(data_.cups_) + " | " + 
       "Cash: " + data_.cash_ + " | "); 

     refreshDisplay(); 
    } 

    @Override 
    public void onPause(){ 
     Log.d(TAG, "onPause() called"); 
     super.onPause(); 
     saveData(); 
     refreshDisplay(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig){ 
     Log.d(TAG, "onConfigurationChanged() called"); 
     super.onConfigurationChanged(newConfig); 
    } 

    private Data getData() { 
     Log.d(TAG, "getData() called - restoring"); 
     GameData player_data = new GameData(this); 
     player_data.open(); 
     Log.d(TAG, "Pulling data from game string..."); 
     Data game_state = new Data(player_data.getGameString()); 
     player_data.close(); 
     Log.d(TAG, "Contents of data = " + 
       "Lemons: " + Integer.toString(game_state.lemons_) + " | " + 
       "Sugar: " + Integer.toString(game_state.sugar_) + " | " + 
       "Ice: " + Integer.toString(game_state.ice_) + " | " + 
       "Cups: " + Integer.toString(game_state.cups_) + " | " + 
       "Cash: " + game_state.cash_ + " | "); 
     return game_state; 
    } 

    private void saveData() { 
     Log.d(TAG, "saveData() called - saving"); 
     GameData player_data = new GameData(this); 
     player_data.open(); 
     Log.d(TAG, "Serializing data into GameData object"); 
     Log.d(TAG, "Contents of data = " + 
       "Lemons: " + Integer.toString(data_.lemons_) + " | " + 
       "Sugar: " + Integer.toString(data_.sugar_) + " | " + 
       "Ice: " + Integer.toString(data_.ice_) + " | " + 
       "Cups: " + Integer.toString(data_.cups_) + " | " + 
       "Cash: " + data_.cash_ + " | "); 
     player_data.setGameString(data_.SerializeGame()); 
     player_data.close(); 

    } 
    private void refreshDisplay() { 
     Log.d(TAG, "refreshDisplay() called - redrawing UI"); 

     NumberFormat nf = NumberFormat.getInstance(); 
     nf.setMinimumFractionDigits(2); 
     nf.setMaximumFractionDigits(2); 
     String totalCash = nf.format(data_.cash_); 

     lemonsLeftTextLabel.setText("Lemons: " + Integer.toString(data_.lemons_)); 
     sugarLeftTextLabel.setText("Sugar: " + Integer.toString(data_.sugar_)); 
     iceLeftLabel.setText("Ice: " + Integer.toString(data_.ice_)); 
     cupsLeftTextLabel.setText("Cups: " + Integer.toString(data_.cups_)); 
     totalCashTextLabel.setText("Cups: " + totalCash); 

    } 
} 
+0

le sucre ne se redessine pas. –

+0

Eh bien, j'ai couru le catlog pour Sugar et j'ai pu un journal dans l'activité de la boutique et l'écran de jeu. quand je clique sur le bouton pour acheter du sucre, j'ai un refreshTotal dans cette activité qui montre le montant total acheté avant que j'accepte et retourne à l'écran d'écran. Cela montre que mon fichier data_.sugar_ obtient le 12 mais ne l'a pas une fois qu'il retourne à l'écran d'affichage –

+0

Eh bien, je ne suis pas sûr des objets Data et GameData, mais vous choisissez de créer un nouvel objet GameData dans saveData() , et ensuite vous passez l'ensemble de l'activité, ce qui semble un peu excessif. Si vous voulez seulement conserver les données, essayez de passer un paquet à la place? En outre, vous pouvez essayer d'utiliser onRetainNonConfigurationInstance() pour réellement conserver un objet complet. Ne persiste-t-il pas vraiment au-delà de la mémoire, mais cela pourrait être une alternative utile? http://android-developers.blogspot.ca/2009/02/faster-screen-orientation-change.html – aheinrich

0

Vous mettez à jour les textviews au mauvais endroit peut-être. Ou appelez le textview.invalidate() après les avoir changés - ce n'est généralement pas nécessaire, mais peut-être s'il n'y avait pas d'interaction de l'utilisateur au moment où ils changent.

+0

Mais j'ai 3 autres textviews qui changent/mise à jour et ils changent très bien. J'utilise un refreshDiplay(); dans onResume –

+0

Ajouter le code qui ne fonctionne pas à votre question s'il vous plaît – zapl

+0

J'ai même essayé de déplacer les TextViews dans le design xml et le jamais déplacé quand j'ai re-couru mon programme –