DialogFragment显示问题。

  • dialogfragment加载的布局不显示,只是显示了设置的背景半透明。报错如下:
com.demo E/IMGSRV: :0: gralloc_module_createfence: Failed to merge mapper sync fds
com.demo E/IMGSRV: :0: QueueCancelBufferWrapper: Failed to create buffer sync object
com.demo W/HardwareRenderer: EGL error: EGL_BAD_SURFACE
com.demo W/HardwareRenderer: Mountain View, we've had a problem here. Switching back to software rendering.

最后将dialogfragment改为了fragment,此问题就消失了。

  • dialogFragment.show的时候,崩溃,异常如下。
java.lang.IllegalStateException
Can not perform this action after onSaveInstanceState

出这个原因是在show的时候所依附的activity已经被销毁了,onSaveInstanceState在按下Home键的时候或者在异常销毁的时候会被调用。
看看为什么会这样commit的时候:

//在activity执行onSaveInstanceState后,会调用自身的fragmentManager的saveAllState方法:
Parcelable saveAllState() {
//省略部分代码
   mStateSaved = true;//设置已保存状态
}
//再看看fragment添加的代码
public int commit() {
        return commitInternal(false);
    }

    public int commitAllowingStateLoss() {
        return commitInternal(true);
    }

    int commitInternal(boolean allowStateLoss) {
        //省略部分代码
        mManager.enqueueAction(this, allowStateLoss);
        return mIndex;
    }

public void enqueueAction(Runnable action, boolean allowStateLoss) {
        if (!allowStateLoss) {
            checkStateLoss();//commit的话,就会执行状态检查
        }
        }
private void checkStateLoss() {
        if (mStateSaved) {//检查到已经被保存了,则会抛出异常。
            throw new IllegalStateException(
                    "Can not perform this action after onSaveInstanceState");
        }
        }

本来针对fragment的解决办法应该是:添加fragment的时候用commitAllowingStateLoss

但是在dialogFragment使用show的方法里面是用的commit。
解决办法:
1:在dialogFragment里面在show的地方捕获一下异常就可以了

try {
            dialogFragment.show(fragmentManager, "DialogFragment");
        } catch (Exception e) {//在activity销毁的时候,可能出现异常
            e.printStackTrace();
        }
        //在dismiss的时候同理。
        try {
                dialogFragment.dismiss();
            } catch (Exception e) {//在activity销毁的时候,可能出现异常
                e.printStackTrace();
            }

2:把dialogFragment当fragment使用,不适用onCreatDialog,使用onCreatView,这样也可以自己按照fragment的解决办法解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DialogFragment显示和隐藏可以通过调用show()和dismiss()方法来实现。在DialogFragment的show()方法中,会创建并显示Dialog。而在dismiss()方法中,会隐藏并销毁Dialog。 对于软键盘的显示和隐藏,可以通过在DialogFragment中使用InputMethodManager来实现。可以在DialogFragment的onCreateView()方法中给EditText设置点击监听,在点击EditText时调用showInput()方法来显示软键盘。在showInput()方法中,获取InputMethodManager实例,然后调用showSoftInput()方法将软键盘显示出来。 这里提供一个示例代码: private void showInput(View view) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { view.requestFocus(); imm.showSoftInput(view, 0); } } 然后在DialogFragment的onCreateView()方法中给EditText设置点击监听,如下所示: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialog_fragment_layout, container, false); EditText editText = view.findViewById(R.id.edit_text); editText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInput(v); } }); return view; } 这样,当EditText被点击时,就会调用showInput()方法显示软键盘。而在DialogFragment的dismiss()方法中,软键盘会自动隐藏掉。 参考资料: 参考资料1 参考资料2<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [dialogFragment软键盘隐藏后显示不出来的问题解决](https://blog.csdn.net/freak_csh/article/details/80781897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Android dialog 去除虚拟按键的解决方法](https://download.csdn.net/download/weixin_38654944/12757041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值