これを理解することはできません。調査を行い、ここで検索し、オンラインで検索しました。Java/ Androidの新しいプログラマーですが、私はこれを正しく行っているようです。
私の主な活動は、タッチされたメニューエントリに基づいていくつかのサブ活動を開始します。これらのそれぞれについて、いくつかの「余分な」文字列データを含むバンドルをサブアクティビティに渡します。各サブアクティビティはデータを取得し、何らかの処理を行ってから、新しい/変更されたデータを.putExtra()でバンドルに戻し、finish()でサブアクティビティを終了します。
これは、1つのサブアクティビティを除くすべてで正常に機能しています。この1つのサブアクティビティでは、onActivityResultに戻ると、インテントオブジェクトは「hasextras」ではなくNULLになります。いろいろ試してみましたが、うまくいきません。これがポイントを証明するのに役立つことを願っているいくつかのスケルトンコードです:
onOptionItemsSelectedの一部である親アクティビティでは、サブアクティビティが開始されます。
case R.id.read_file:
Intent intentR = new Intent(this, GetReadFileName.class);
intentR.putExtra(GetReadFileName.EXTRA_WHATEVER, baseDirectory);
startActivityForResult(intentR, REQUEST_READ_FILE_NAME);
return true;
case R.id.write_file:
Intent intentW = new Intent(this, GetWriteFileName.class);
intentW.putExtra(GetWriteFileName.EXTRA_FILE_NAME, fileName);
startActivityForResult(intentW, REQUEST_WRITE_FILE_NAME);
return true;
サブアクティビティGetWriteFileName:
public class GetWriteFileName extends Activity{
String fileName;
public static String EXTRA_FILE_NAME = "file_name";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wfn);
fileName = getIntent().getExtras().getString(EXTRA_FILE_NAME);
// fileName is PROPERLY received from parent. No issues here.
.
. do processing
.
Intent intent = new Intent();
intent.putExtra(EXTRA_FILE_NAME, fileName); // put changed/modified name in bundle for parent
setResult(Activity.RESULT_OK, intent);
finish();
サブアクティビティGetReadFileName:
public class GetReadFileName extends Activity {
/** Called when the activity is first created. */
public static String EXTRA_WHATEVER = "whatever";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String extStorageDir = Environment.getExternalStorageDirectory().toString() + getIntent().getExtras().getString(EXTRA_WHATEVER);
// extStorageDir is PROPERLY retrieved from parent. No issue here.
.
. do processing
.
Intent intent = new Intent();
intent.putExtra(EXTRA_WHATEVER, "Just a damn string"); // Stuff to pass back OUT to parent
// Note: doesn't matter if I have a literal, String variable, or anything else here. End result is the same.
setResult(Activity.RESULT_OK);
finish();
そして最後に、onActivityResultで:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_WRITE_FILE_NAME:
if (resultCode == Activity.RESULT_OK) {
fileName = data.getExtras().getString(GetWriteFileName.EXTRA_FILE_NAME);
}
break;
case REQUEST_READ_FILE_NAME:
if (resultCode == Activity.RESULT_OK) {
fileName = data.getExtras().getString(GetReadFileName.EXTRA_WHATEVER);
}
break;
あなたは、私は、閉じている中括弧などの省略を許してくれることを願っています。
問題は、GetWriteFileNameが親に戻ると、インテントデータがデバッガーに「余分なものがある」と表示され、文字列を取得できることです。
GetReadFileNameが親に戻るとき、インテントデータはNULLであり、それが問題です。なぜNULLなのですか?私の観点からは、両方のアクティビティで同じことを行って、親に物を返しています。私のAndroidマニフェストファイルには、私が思うべきものが含まれています。キーフィールドは正しいようです。私はここで立ち往生しています。アイデア?
マニフェストファイルのセクション:
<activity android:name=".DeviceListActivity"
android:label="@string/select_device"
android:theme="@android:style/Theme.Dialog"
android:configChanges="orientation|keyboardHidden" />
<activity android:name=".GetWriteFileName"
android:theme="@android:style/Theme.Dialog"
android:configChanges="orientation|keyboardHidden" />
<activity android:name=".GetReadFileName"
android:theme="@android:style/Theme.Dialog"
android:label="@string/select_file"
android:configChanges="orientation|keyboardHidden" />
/>
このすべてを読んでくれてありがとう。