2016-06-18 3 views
0

したがって、MainActivity.javaには次のコードがあります。getExtras()は、戻るナビゲーションでnullを返します。

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

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(MainActivity.this, SecondActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

そして、私のScondActivity.javaには次のコードがあります。

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

    String s = getIntent().getExtras().getString("testString"); 
    Log.v(SecondActivity.class.getSimpleName(), s); 

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(SecondActivity.this, ThirdActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

そして、私のThirdActivity.javaは以下のコードを持っています。

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

    String s = getIntent().getExtras().getString("testString"); 
    Log.v(ThirdActivity.class.getSimpleName(), s); 
} 

私はこのアプリを実行している間、すべて正常に動作します。しかし、私がThirdActivity.javaからSecondActivity.javaに戻ったとき、NullPointerExceptionString s = getIntent().getExtras().getString("testString");に届いています。

どうすればこの問題を解決できますか?

可能性のあるヘルプは、非常に高い評価を受ける可能性があります。

+1

sharedPrefにその値を保存してから使用します。 – Manifest

答えて

2

Intentを使用して1つのアクティビティから別のアクティビティに渡されたデータが一時的なもので、別のアクティビティに切り替えるとデータが破損するため、このエラーが発生します。 SecondActivityからThirdActivityに切り替えると、FirstActivityのエキストラが破棄されます。この問題の代替方法は、共有環境設定でこれらの追加機能を保存できることです。共有設定を使用すると、ローカルストレージにデータが保存され、すべてのアクティビティで使用できるようになります。 共有好みにガイドがhere

+0

実際には、どのストレージにもデータを保存したくありません。それは私が意図からそれを得ることを試みたことです。とにかく、「エクストラ」の説明に感謝します。ニース、+1が追加されました。 – Gunaseelan

0
を見つけることができますが、この問題に取り組むために、アクティビティのライフサイクルメソッドからonSaveInstanceStateを()を使用することができます
String s = ""; 
    if(getIntent().getExtras() != null) 
    { 
     s = getIntent().getExtras().getString("testString"); 
     Log.v(SecondActivity.class.getSimpleName(), s); 
    } 
1

セカンドとTird活動の両方でコードの下にあなたのonCreateメソッドを変更

。以下のURLを見てください:https://developer.android.com/training/basics/activity-lifecycle/recreating.html

私が提供しているリンクから段落:ユーザーが戻るを押すか、活動は、システムの概念を自分自身を終了するので、あなたの活動が破壊され

そのアクティビティーがもはや必要ではないことをビヘイビアが示しているため、そのアクティビティー・インスタンスは永遠に失われます。しかし、システムが(通常のアプリケーションの動作ではなく)システムの制約のためにアクティビティを破壊した場合、実際のActivityインスタンスはなくなりますが、システムは、ユーザがそれに戻るとシステムが新しいアクティビティのインスタンスを、そのアクティビティが破棄されたときの状態を表すセーブされたデータのセットを使用して更新します。以前の状態を復元するためにシステムが使用する保存されたデータは、「インスタンス状態」と呼ばれ、Bundleオブジェクトに格納されたキーと値のペアの集合です。

...

活動状態についての追加データを保存するには、onSaveInstanceState()コールバックメソッドをオーバーライドする必要があります。このメソッドは、ユーザーがあなたのアクティビティを離れるときに呼び出され、予期せずアクティビティが破棄された場合に保存されるBundleオブジェクトを渡します。後でアクティビティインスタンスを再作成する必要がある場合は、同じBundleオブジェクトをonRestoreInstanceState()メソッドとonCreate()メソッドの両方に渡します。だからではなく、自分自身の共有設定を作成する

は、あなたがonSaveInstanceState()とのonCreate(またはonRestoreInstanceState)からパラメータとして渡されたのバンドルを使用することができます。

0

2番目のアクティビティで、sをインスタンス変数として宣言します。

String s; 

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

    s = getIntent().getExtras().getString("testString"); 
    Log.v(SecondActivity.class.getSimpleName(), s); 

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(SecondActivity.this, ThirdActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

コードがダウン上から読み出され、ポインタはその方法のonCreateの最後のブレースに到達するまでその特定のメソッド内部変数に割り当てられた値だけ続きます。クリックリスナーは、ユーザーに応じていつでも発生することができます。その時点で値は生存していないため、null値が得られます。

インスタンス変数に値を割り当てることは、そのインスタンスの存続期間まで持続します。したがって、その変数からの任意の使用は、ある値を前に割り当てられた特定の値の回復を保証します。

アクティビティがバックグラウンドの間に十分なメモリがない場合、OSによってアクティビティが強制終了される可能性があります(アクティビティスタックからデキューされます)。その場合、onSaveInstanceState(Bundle outState)を使用する方がはるかに安全です。

関連する問題