2016-04-11 4 views
0

私のアプリはTextViewsを動的に作成できる必要があるので、私のアプリがGCedであるかオリエンテーションを切り替えていれば、それらを復元する必要があります。問題は私がTextViewsの状態を復元する方法を理解できないことです。 TextView.onSaveInstanceState()で状態を保存するとうまくいくように見えますが、ParcelableonRestoreInstanceState()に渡されても、何も起こりません。結果のビューは空白になります。私は、デバッガでstate.getParcelable("message")の値をチェックして、それは間違いなく必要な情報を持っているTextView.onRestoreInstanceState()が機能しない

public class MainActivity extends AppCompatActivity { 

TextView v; 
@Override 
protected void onCreate(Bundle state) { 
    super.onCreate(state); 
    setContentView(R.layout.activity_main); 
    ViewGroup main = (ViewGroup) findViewById(R.id.main); 
    v = new TextView(this); 
    main.addView(v); 

    if (state == null) { 
     v.setText("A simple message."); 
    } else { 
     v.onRestoreInstanceState(state.getParcelable("message")); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putParcelable("message", v.onSaveInstanceState()); 
} 

} 

:これは動作しません短い例です。 onRestoreInstanceState()ちょうどそれを使用していません。助けを借りていただければ幸いです。

EDIT:私はデバッガで台無しにしました。情報は実際にはバンドルに書き込まれませんでした。 TextView.onSaveInstanceState()が空のParcelableを返しました。それが本当の問題でした。

答えて

-1

onCreate()の間に状態を復元する代わりに、onStart()メソッドの後にシステムが呼び出すonRestoreInstanceState()を実装することができます。あなたはバンドルがnullであるかどうかをチェックする必要はありませんので、このシステムは、復元する保存された状態がある場合のみonRestoreInstanceState()を呼び出します。

は、あなたの活動状態を保存します。

static final String STATE_SCORE = "playerScore"; 
static final String STATE_LEVEL = "playerLevel"; 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

は、あなたの活動の状態を復元します。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 

    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
     // Probably initialize members with default values for a new instance 
    } 

} 

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 

    // Restore state members from saved instance 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} 
+0

問題は、特にParcelableからテキストビュー状態を復元することです。 onRestoreInstanceState()をオーバーライドすることで同じ問題が発生します。 – enigmaticPhysicist

0

私はそれを理解しました。問題はTextView.onSaveInstanceState() -not TextView.onRestoreInstanceState()であった。 TextView.onSaveInstaceState()は、最初にTextView.setFreezesText(true)を呼び出して明示的に要求した場合にのみ状態を保存します。 SURPRISE!ありがとう、Google。また、onRestoreInstanceState()はFreezesTextプロパティを復元しないことに注意してください。ああ、Google。あなたはほんのちょっと変だ。私たちはあなたと何をしますか?

関連する問題