[Android]IntentでEditTextの値を画面間で渡せない時にチェックすること

例えば、子画面で入力された値を親画面に戻す場合の処理を考えてみます。

子画面側の処理

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();
}

関連記事

コメントを残す

メールアドレスが公開されることはありません。