来自相机的 Android 丢失片段视图

Posted

技术标签:

【中文标题】来自相机的 Android 丢失片段视图【英文标题】:Android coming from camera loses fragment view 【发布时间】:2017-09-01 11:44:19 【问题描述】:

我已经实现了一个包含一些步骤的公式。每一步都在一个新的Fragment 中使用FrameLayout

在最后一步 (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);
    .....

有人有想法吗?提前致谢!

【问题讨论】:

【参考方案1】:

请试试这个:

transaction.add(R.id.container, fragment);
transaction.disallowAddToBackStack();
transaction.commit();

通过使用replace,您正在替换彼此顶部的片段,因此它不会删除前一个片段或在当前片段下方添加新片段。

使用add 可以确保它始终位于顶部。

disallowAddToBackStack 将确保您没有在堆栈中持有任何东西。

【讨论】:

以上是关于来自相机的 Android 丢失片段视图的主要内容,如果未能解决你的问题,请参考以下文章

Android:通过片段进行相机预览。从活动中确定

在片段中重新加载android视图

是否可以自定义 android 的相机裁剪意图视图?

android如何跨片段分离/附加保留视图状态

如何在没有控件的情况下在 android 中制作相机应用程序,以便仅在屏幕上显示来自镜头的视图? [关闭]

Android中的相机,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像失真