Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onActivityResult和onResume之间的视图状态丢失_Android_Fragment_Lifecycle_Onactivityresult - Fatal编程技术网

Android onActivityResult和onResume之间的视图状态丢失

Android onActivityResult和onResume之间的视图状态丢失,android,fragment,lifecycle,onactivityresult,Android,Fragment,Lifecycle,Onactivityresult,我正在使用startActivityForResult()从相机捕获图像。当使用开发人员选项“不保留活动”进行测试时,我注意到我的视图状态在onviewstateredured中被正确还原,但在调用onActivityResult之前再次丢失。看起来同一片段的第二个实例正在创建中;有两个调用onCreate,一个调用有效的savedInstanceState,另一个调用savedInstanceState==null。第一个永远无法在恢复时使用 这是我在日志中看到的: E/CaptureFrag

我正在使用
startActivityForResult()
从相机捕获图像。当使用开发人员选项“不保留活动”进行测试时,我注意到我的视图状态在
onviewstateredured
中被正确还原,但在调用
onActivityResult
之前再次丢失。看起来同一片段的第二个实例正在创建中;有两个调用
onCreate
,一个调用有效的
savedInstanceState
,另一个调用
savedInstanceState==null
。第一个永远无法在恢复时使用

这是我在日志中看到的:

E/CaptureFragment﹕ fireTakePictureIntent: tempPhotoPath: /storage/emulated/0/Pictures/JPEG_2014-10-15 23.19.45.jpg
E/CaptureFragment﹕ startActivityForResult: tempPhotoPath: /storage/emulated/0/Pictures/JPEG_2014-10-15 23.19.45.jpg
I/am_on_paused_called﹕ [0,com.chimbori.galapagos.views.capture.CaptureActivity]
E/CaptureFragment﹕ onSaveInstanceState: tempPhotoPath: /storage/emulated/0/Pictures/JPEG_2014-10-15 23.19.45.jpg
E/CaptureFragment﹕ onCreate: tempPhotoPath: /storage/emulated/0/Pictures/JPEG_2014-10-15 23.19.45.jpg
E/CaptureFragment﹕ onViewStateRestored: tempPhotoPath: /storage/emulated/0/Pictures/JPEG_2014-10-15 23.19.45.jpg
E/CaptureFragment﹕ onCreate: tempPhotoPath: null
E/CaptureFragment﹕ onStart
E/CaptureFragment﹕ onActivityResult : tempPhotoPath: null
E/CaptureFragment﹕ onResume: tempPhotoPath: null
I/am_on_resume_called﹕ [0,com.chimbori.galapagos.views.capture.CaptureActivity]
方法很简单:

private String tempPhotoPath;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  if (savedInstanceState != null && savedInstanceState.containsKey(IntentConstants.EXTRA_PHOTO_FILE)) {
    tempPhotoPath = savedInstanceState.getString(IntentConstants.EXTRA_PHOTO_FILE);
  }
  Log.e(TAG, "onCreate: tempPhotoPath: " + tempPhotoPath);
}

private void fireTakePictureIntent() {
  Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
    tempPhotoPath = FilePaths.createTempPhotoPath().getAbsolutePath();
    Log.e(TAG, "fireTakePictureIntent: tempPhotoPath: " + tempPhotoPath);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempPhotoPath)));
    Log.e(TAG, "startActivityForResult: tempPhotoPath: " + tempPhotoPath);
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
  }
}

@Override
public void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  if (tempPhotoPath != null) {
    Log.e(TAG, "onSaveInstanceState: tempPhotoPath: " + tempPhotoPath);
    outState.putString(IntentConstants.EXTRA_PHOTO_FILE, tempPhotoPath);
  }
}

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
  super.onViewStateRestored(savedInstanceState);
  if (savedInstanceState != null && savedInstanceState.containsKey(IntentConstants.EXTRA_PHOTO_FILE)) {
    tempPhotoPath = savedInstanceState.getString(IntentConstants.EXTRA_PHOTO_FILE);
    Log.e(TAG, "onViewStateRestored: tempPhotoPath: " + tempPhotoPath);
  }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
    Log.e(TAG, "onActivityResult : tempPhotoPath: " + tempPhotoPath);
  }
}

你知道为什么它会在
onViewStateRestored
上被正确还原,但在
onActivityResult
和更高版本上返回空值吗?

好的,我知道了。我在
CaptureActivity
中重新创建
CaptureFragment
,即使我被传递了一个非空的
savedInstanceState
。这就解释了为什么要创建两个片段而不是一个片段

修复前:
CaptureActivity.onCreate

CaptureFragment captureFragment = new CaptureFragment();
getFragmentManager().beginTransaction()
    .replace(R.id.activity_capture_content_frame, captureFragment,
        CaptureFragment.class.getCanonicalName())
    .commit();
固定的:

CaptureFragment captureFragment = (savedInstanceState != null)
    ? (CaptureFragment) getFragmentManager().findFragmentByTag(CaptureFragment.class.getCanonicalName())
    : new CaptureFragment();
getFragmentManager().beginTransaction()
    .replace(R.id.activity_capture_content_frame, captureFragment,
        CaptureFragment.class.getCanonicalName())
    .commit();

将android:config放入活动中manifest@Dipu我想你指的是android:configChanges,因为清单中没有android:config这样的东西。这不是一个解决方案,因为这不是一个活动配置更改,它是启动一个全新的活动,然后返回到旧的活动。是的,我的意思是启动全新的活动意味着??是否调用onActivityResult?我在onCreate()中看到两次。第二次可能是另一种情况。