2016-04-08 6 views
-1

他のアクティビティに移動して戻るときにHashMapの値を保持しようとしています。これは私の今のコードです。Android HashMapがアクティビティに戻るときに永続しない

HashMapは動作し、ビュー内のEditTextからデータを取得して保存できます。しかし、すぐに私が活動し、リターンから去るよう、HashMapのは、空にするために再初期化され

- > {}

私はマニュアルを見てきましたし、変数のデータであることを保証するのが正しい方法であると思われます持続した。しかし、それは動作しません。

私が問題に何ができるか教えてください:

public class ScriptActivity extends MainActivity { 

    HashMap timeAndMessages; 
    EditText message; 
    EditText time; 



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

     if (savedInstanceState != null) { 
      timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts"); 
     } else { 
      timeAndMessages = new HashMap(); 
     } 

     message = (EditText)findViewById(R.id.messageText); 
     time = (EditText)findViewById(R.id.timeText); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     restore(savedInstanceState); 
    } 

    private void restore(Bundle savedInstanceState) { 
     if (savedInstanceState != null) { 
      timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts"); 

     } 
    } 

    public void createMessage (View view){ 

     String stringmessage = message.getText().toString(); 
     int inttime = Integer.parseInt(time.getText().toString()); 

     timeAndMessages.put(inttime, stringmessage); 

     Toast.makeText(getApplicationContext(), "Will display : " + stringmessage + " At time : " + Integer.toString(inttime) , Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
     super.onSaveInstanceState(outState, outPersistentState); 
     outState.putSerializable("alerts", timeAndMessages); 
    } 
} 
+0

まず、 'restore()'メソッドが表示されません。次に、onSaveInstanceState()メソッドはAPIレベル21以降のデバイスでのみ使用されます。 'minSdkVersion'が21より小さい場合には' onSaveInstanceState() 'バージョンでは' Bundle'だけが必要です。第3に、これらのインスタンス状態は任意のシナリオではなく、特定のもの(設定変更など)です。あなたの質問を編集して、「アクティビティをナビゲートする」という意味を説明してください。 – CommonsWare

+0

"timeAndMessages"宣言と初期化コードを投稿してください。そして、それがユーザー定義のオブジェクトのコレクションであれば、そのPOJOも投稿してください。 –

+0

@CommonsWare APIレベルは23です。outPersistentStateの追加/削除はコードに影響しないようです。 –

答えて

0

しかし、すぐに私が活動し、リターンから去るよう、HashMapのは、空にするために再初期化される - > {}

「アクティビティとリターンから離れる」とは、「戻る」ボタンを押してから新しいアクティビティを開始するための何かをするということです。

保存されたインスタンスの状態のためBundleは二つの主なシナリオで使用されます。

  • 構成の変更(例えば、ユーザが画面を回転させる)
  • プロセスの終了、およびあなたの最近のタスクにユーザーが戻る(たとえば、 、概要画面を介して)

活動を破壊するためにBACKを押すことはそれらのどちらでもありません。したがって、状態は保存されません。

このHashMapは、モデルデータを表す場合—あなたは関係なく、ユーザーがデータベースに保存し、アプリ—をどのように使用するか、バックに再び時間とを取得することができないことを期待したデータの並べ替え、SharedPreferences、他のソートをファイル、または "クラウド"。

the Activity documentationでこれらのシナリオの詳細を読むことができます。