2017-08-04 3 views
0

こんにちは私はBundle savedInstanceStateがアクティビティの作成と復元でどのように動作するのかを練習しています。 savedInstanceStateifブロックが実行されることはありませんnullであるとして、これは「ハロー」とEditTextフィールドを設定します明らかに最初のonCreate()バンドルテストのEditTextが動作しない

private EditText mTextBox; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTextBox = (EditText) findViewById(R.id.etName); 
     mTextBox.setText("hello"); 
     if(savedInstanceState != null){ 
      Toast.makeText(this, savedInstanceState.getString("name"), 
         Toast.LENGTH_SHORT).show(); 
     mTextBox.setText(savedInstanceState.geteString("name")); 
    } 
} 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putString("name", "Joe"); 
     super.onSaveInstanceState(outState); 
} 

:私はこれを試してみました。私はActivityは、すべてのコールバックとトーストifブロック内の文字列を通過する方向を変更する場合は、しかし、それは、渡されたBundleからの値でmTextBoxを設定しません。EditTextはまだhello代わりのJoe、しかし、Toastに設定されていますinブロックはJoeを示します。

これが私の期待どおりに機能しない理由を誰でも指摘できますか?

ありがとうございました

+0

あなたはmTextBoxを使用していません。 setText()on name.setText(savedInstanceState.geteString( "name")); 部分? – Sheychan

+0

申し訳ありませんが、ASからコードをコピーしてここに変数名を変更しましたが、その変数を変更していないため、更新されました。間違いを発見してくれてありがとう。 – dhssa

+0

https://github.com/frankiesardo/icepick –

答えて

2

これはTextView.getFreezesTextの結果として起こっている、これは以下となります。

戻り、このテキストビューは 、凍結つららにそのテキスト全体の内容を含めているかどうか。 EditTextの場合、常にtrueを返します

そしてTextView.setFreezesTextからいくつかの詳細: は、カーソル 位置と動的な状態に加えて、つららに凍結するとき、このテキストビューは、そのテキスト全体の内容を保存するかどうかを

コントロール。デフォルトではこれはfalseで、テキストを保存しません。テキストビューのテキストが の永続ストレージ(コンテンツプロバイダなど)のどこかに保存されていない場合は、 に設定して、ビュー が解凍された場合にユーザーがデータを失うことがないようにします。 EditTextでは、の値にかかわらず、常に が有効です。

は、savedInstanceStateを指しています。あなた自身を保存し、テキストを復元したい場合は

、カスタムEditTextを作成し、getFreezesTextをオーバーライドすることができ、何かのように:

public class NonFreezingEditText extends AppCompatEditText { 

    public NonFreezingEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean getFreezesText() { 
     return false; 
    } 

} 

また、使用することができView.post

mTextBox.post(() -> mTextBox.setText(savedInstanceState.getString("name"))); 

またはActivity.onRestoreInstanceState

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    mTextBox.setText(savedInstanceState.getString("name")); 
} 
+0

ありがとう、私はonRestoreInstanceState()を使った方が簡単ですし、カスタムEditTextです。 – dhssa

1

あなたはsetText different "hello"が必要です。例を参照してください

private EditText mTextBox; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mTextBox = (EditText) findViewById(R.id.etName); 
    mTextBox.setText("hello"); 
    if(savedInstanceState != null){ 
     Toast.makeText(this, savedInstanceState.getString("name"), 
        Toast.LENGTH_SHORT).show(); 
    mTextBox.setText(savedInstanceState.getString("name")); 
} 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    mTextBox.setText("Joe"); 
    outState.putString("name", mTextBox.getText().toString()); 
    super.onSaveInstanceState(outState); 
} 

または、onRestoreInstanceStateを上書きする必要があります。テキストが変更されないときはonCreateを呼び出さない。

@Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if(savedInstanceState != null){ 
     mTextBox.setText(savedInstanceState.getString("name")); 
    } 
    } 
関連する問題