Android DialogFragment中使用的一些细节处理

1、默认来说DialogFragment是不全屏的,需要以下代码进行设置

    /**
     * Activity创建后才会有window
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //设置全屏
        getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }

2、外侧背景透明问题
DialogFragment对话框有两层,一层是外部的背景,默认是半透明的,由以下代码进行更改

    @Override
    public void onStart() {
        super.onStart();
        //去除背景
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams windowParams = window.getAttributes();
        windowParams.dimAmount = 0.0f;

        window.setAttributes(windowParams);
    }

内层的背景默认是白色的,如果自定义的布局背景是半透明的图片,需要把背景改下,否则半透明图片会不生效

    /**
     * Activity创建后才会有window
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
       getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//需要这一行来解决对话框背景有白色的问题(颜色随主题变动)
    }

3、不管对话框显示多少次,都用同一个dialog的实例,但是传参数的时候,参数都可以进行改变,例如:

MainActivity.java

private TestDialog dialog;

private void showDialog(){
	if(null == dialog){
		dialog = new TestDialog();
	}
	Bundle bundle = new Bundle();
        bundle.putInt("test",1);
        settingTimeDialog.setArguments(bundle);
        settingTimeDialog.show(getSupportFragmentManager(),"");
}

TestDialog.java

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Bundle bundle = getArguments();
        if (null != bundle){
            int test = bundle.getInt(test,8000);//每次调用show进行显示的时候都会执行这个方法获取参数
        }
    }

4、设置对话框内全局按键监听,当对话框显示时候,所有遥控器按键均可以监听

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                Log.e("YM","按键:"+keyCode);
                return false;
            }
        });
    }

5、点击空白处禁止关闭

1、
setCanceledOnTouchOutside(false):调用这个方法时,按对话框以外的地方不起作用。按返回键还起作用。

setCanceledOnTouchOutside(true):点击灰色空白处关闭弹框。

2、
setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用。按返回键也不起作用

 

注意:setCanceledOnTouchOutside(true)如果需要起作用,不能设置setCanceleable(false),如果设置为false,则不起作用。

发布了132 篇原创文章 · 获赞 29 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Mr_Tony/article/details/104783448
今日推荐