来自相机的Android失去了碎片视图



我已经实现了一个有一些步骤的方形。每个步骤都使用FrameLayout在新的Fragment中。

在最后一步(FRAGMENT A)中有一个Button。单击此Button时,启动了新的FragmentFRAGMENT 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将确保您没有在堆栈中持有任何东西。

最新更新