例えば、子画面で入力された値を親画面に戻す場合の処理を考えてみます。
子画面側の処理
public class ChildActivity extends Activity { EditText edtMessage; ...中略... /* OKボタンがクリックされた時のリスナ */ private class BtnOkClickListener implements OnClickListener { @Override public void onClick(View v) { Intent it = getIntent(); it.putExtra( "Key_Message", edtMessage.getText() ); setResult( RESULT_OK, it ); finish(); } } } |
これを以下のように、Intent#getStringExtra()で取ろうとしても上手くいきません
nullが返ってきてしまいます。
public class ParentActivity extends Activity { /** ボタンクリック時のハンドラ(子画面に遷移) */ private class BtnAddAlermClickListener implements OnClickListener { public void onClick(View v) { Intent it = new Intent( getApplicationContext(), ChildActivity.class ); startActivityForResult( it, REQ_INPUT_MSG ); } } /** 子画面から戻ってきた時のハンドラ */ @Override public void onActivityResult( int reqCode, int result, Intent it ) { if ( reqCode == REQ_INPUT_MSG && result == RESULT_OK ) { String msg = it.getStringExtra( "Key_Message" ); txtMessage.setText( msg ); } } } |
この理由は以下の通りです。
edtMessage.getText()は戻り値としてStringではなくEditableオブジェクトを返します。
ですので、it.putExtra()で管理されるvalueはEditableクラスのインスタンスです。
一方、it.getStringExtra()では、キーに対応するvalueがStringクラスで無い場合はnullを返す仕様となっています。この為、変数msgにはnullがセットされてしまいます。
この問題を回避するには、セット時にtoString()で明示的にStringオブジェクトを格納します。
public void onClick(View v) { Intent it = getIntent(); it.putExtra( "Key_Message", edtMessage.getText().tostring() ); setResult( RESULT_OK, it ); finish(); } |
関連記事
コメントを残す