Android 来自相机的片段视图丢失
Android coming from camera loses fragment view
我已经实现了一个包含一些步骤的公式。每一步都在使用 FrameLayout
的新 Fragment
中。
最后一步(FRAGMENT A
)有一个Button
。单击此 Button
时,将启动新的 Fragment
(FRAGMENT B
) 和相机 Intent
。
有时 在拍照并关闭相机后,会显示 FRAGMENT A
而不是 FRAGMENT B
。发生这种情况时,UI
元素被冻结,任何字段都可以点击,继续使用该应用程序的唯一方法是关闭 Form
并重新开始该过程。
我认为这是一个 OOM
错误,所以 Activity
被杀死/恢复并且最后的状态没有被正确存储。
我已尝试检查,但未调用方法 onRestoreInstanceState()
。 FRAGMENT B
中的方法也会在相机关闭后调用,无论是否显示。这是我打开 FRAGMENT B
和相机的代码:
基础片段
private void setCurrentFragment(int pos, boolean animate) {
showFragment(buildFragment(mCurrentPage), animate, animationFromRight);
....
}
private Fragment buildFragment(int pos) {
switch (mHasFamilyManager ? pos : pos + 1) {
............
case 3:
mCurrentFragment = PhotoVerificationFragment.newInstance();
if (mState.getAttachments().isEmpty()) {
switch (mState.getPictureSelector()) {
.....
case CAMERA:
onAddCameraPictureClicked();
break;
}
.....
return mCurrentFragment;
}
private void showFragment(final Fragment fragment, boolean animate,
final boolean animationFromRight) {
if (fragment != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (animate) {
if (animationFromRight) {
transaction.setCustomAnimations(R.anim.activity_slide_in_right,
R.anim.activity_slide_out_left);
} else {
transaction.setCustomAnimations(R.anim.activity_slide_in_left,
R.anim.activity_slide_out_right);
}
}
transaction.addToBackStack(null);
transaction.replace(R.id.container, fragment);
transaction.commit();
}
}
MainActivity
public void onAddCameraPictureClicked() {
startActivityForResult(takePictureIntent, requestCode);
.....
}
有人有想法吗?提前致谢!
请试试这个:
transaction.add(R.id.container, fragment);
transaction.disallowAddToBackStack();
transaction.commit();
通过使用 replace
,您将在彼此之上替换片段,因此它不会删除前一个片段或在当前片段下方添加新片段。
使用 add
确保它总是在最前面。
disallowAddToBackStack
将确保您没有在堆栈中持有任何东西。
我已经实现了一个包含一些步骤的公式。每一步都在使用 FrameLayout
的新 Fragment
中。
最后一步(FRAGMENT A
)有一个Button
。单击此 Button
时,将启动新的 Fragment
(FRAGMENT B
) 和相机 Intent
。
有时 在拍照并关闭相机后,会显示 FRAGMENT A
而不是 FRAGMENT B
。发生这种情况时,UI
元素被冻结,任何字段都可以点击,继续使用该应用程序的唯一方法是关闭 Form
并重新开始该过程。
我认为这是一个 OOM
错误,所以 Activity
被杀死/恢复并且最后的状态没有被正确存储。
我已尝试检查,但未调用方法 onRestoreInstanceState()
。 FRAGMENT B
中的方法也会在相机关闭后调用,无论是否显示。这是我打开 FRAGMENT B
和相机的代码:
基础片段
private void setCurrentFragment(int pos, boolean animate) {
showFragment(buildFragment(mCurrentPage), animate, animationFromRight);
....
}
private Fragment buildFragment(int pos) {
switch (mHasFamilyManager ? pos : pos + 1) {
............
case 3:
mCurrentFragment = PhotoVerificationFragment.newInstance();
if (mState.getAttachments().isEmpty()) {
switch (mState.getPictureSelector()) {
.....
case CAMERA:
onAddCameraPictureClicked();
break;
}
.....
return mCurrentFragment;
}
private void showFragment(final Fragment fragment, boolean animate,
final boolean animationFromRight) {
if (fragment != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (animate) {
if (animationFromRight) {
transaction.setCustomAnimations(R.anim.activity_slide_in_right,
R.anim.activity_slide_out_left);
} else {
transaction.setCustomAnimations(R.anim.activity_slide_in_left,
R.anim.activity_slide_out_right);
}
}
transaction.addToBackStack(null);
transaction.replace(R.id.container, fragment);
transaction.commit();
}
}
MainActivity
public void onAddCameraPictureClicked() {
startActivityForResult(takePictureIntent, requestCode);
.....
}
有人有想法吗?提前致谢!
请试试这个:
transaction.add(R.id.container, fragment);
transaction.disallowAddToBackStack();
transaction.commit();
通过使用 replace
,您将在彼此之上替换片段,因此它不会删除前一个片段或在当前片段下方添加新片段。
使用 add
确保它总是在最前面。
disallowAddToBackStack
将确保您没有在堆栈中持有任何东西。