Android: Subactivity возвращает объект NULL Intent в onActivityResult - PullRequest
2 голосов
/ 14 июля 2011

Не могу понять это. Закончили исследования, искали здесь, в Интернете и т. Д. Все еще новый программист на Java / Android, но, похоже, я все делаю правильно, так что вот так.

Мое основное занятие начинается с нескольких подзадач, основанных на записях в меню. Для каждого из них я передаю пакет в subactivity с некоторыми «дополнительными» строковыми данными. Каждая субактивность извлекает данные, выполняет некоторую обработку, затем помещает новые / измененные данные обратно в пакет с помощью .putExtra () и выходит из субактивности с помощью finish ().

Это работает нормально во всех, кроме ОДНОЙ из субактивностей. в этом подактиве, когда я возвращаюсь обратно к onActivityResult, объект намерения равен 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 Manifest содержит то, что я думаю, что должно Ключевые поля кажутся правильными. Я застрял здесь. Идеи?

Раздел файла манифеста:

        <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" />
    />

Спасибо, что прочитали все это.

1 Ответ

3 голосов
/ 14 июля 2011

В своей активности записи вы возвращаете намерение. В вашем прочитанном, вы не.

setResult(Activity.RESULT_OK, intent);

вместо

setResult(Activity.RESULT_OK);
...