2012-03-20 4 views
3

У меня проблема с моим TextView. У меня есть PlayScreenActivity, который отображает информацию о расходных материалах. в верхней части экрана. затем я иду на экран магазина и покупаю принадлежности. когда я возвращаюсь, все остальные меняются, но 1, и он отображает новое значение, если я изменю свой телефон и изменения ориентации, это единственный способ увидеть добавленные закупленные предметы. У кого-нибудь есть идея, почему это происходит?Проблема с TextView в android

Я установил ориентацию экрана на портрет, чтобы увидеть, будет ли он работать, если он не может переключиться, но не исправить.

EDIT

Вот копия моей деятельности Код:

общественный класс PlayscreenActivity расширяет 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)); 

} 

}

ответ

0

... он будет отображать новое значение, если я включаю свой телефон и ориентация меняется

Android уничтожит и воссоздавать активность, когда происходят изменения конфигурации во время выполнения. Это имеет смысл, что ваши новые переменные втягиваются на поворот экрана, потому что вся деятельность воссозданной:

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

Если большинство ваших TextView виджетов обновления, когда ваш PlayScreenActivity возобновляется, ваш refreshDisplay() звонок работает (в некоторой степени). Какой виджет не перерисовывается? Я бы также запустил некоторые записи и посмотрел, как LogCat предложил zapl.

EDIT

Пример кода с некоторыми лесозаготовок (я переехал виджеты в поля ...)

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

Сахарный код не перерисовывается. –

+0

Ну, я запустил catlog для Sugar, и я зарегистрировал как активность магазина, так и игровой экран. когда я нажимаю кнопку, чтобы купить сахар, у меня есть refreshTotal в этом действии, который показывает общую покупную сумму, прежде чем я приму и вернусь к экрану воспроизведения. Это показывает, что мой data_.sugar_ получает 12, но не имеет его, как только он возвращается на playcreen –

+0

Ну, я не уверен в объектах Data и GameData, но вы решили создать новый объект GameData в saveData() , а затем вы передаете ему всю активность, что кажется немного чрезмерным. Если вы хотите только сохранить данные, попробуйте передать Bundle вместо этого? Кроме того, вы можете попробовать использовать onRetainNonConfigurationInstance() для фактического сохранения полного объекта. На самом деле это не остается за пределами памяти, но это может быть полезной альтернативой? http://android-developers.blogspot.ca/2009/02/faster-screen-orientation-change.html – aheinrich

0

Вы обновить TextViews в неправильном месте, может быть. Или позвоните textview.invalidate() после того, как вы их измените - это обычно не требуется, но может быть, если в момент их изменения не было взаимодействия с пользователем.

+0

Но у меня есть 3 других TextViews, которые изменяют/обновления, и они изменяются только в порядке. Я использую refreshDiplay(); in onResume –

+0

Добавьте код, который не работает на ваш вопрос, пожалуйста, – zapl

+0

Я даже пытался перемещаться по TextViews в xml-дизайне и никогда не перемещался, когда я перезапускал свою программу –

Смежные вопросы