Android 继承DialogFragment实现对话框

前言

在重构项目UI时,由于需要重新改下对话框界面,然后期望效果图如下:
Android 继承DialogFragment实现对话框_第1张图片
虽然简单,但是感觉很久都没动手写UI,差不多都忘了[尴尬],所以搞起来也是稍微耗了点时间,于是打算记录下。

问题

继承DialogFragment后,如果什么都不处理,则效果如下:
Android 继承DialogFragment实现对话框_第2张图片

与期望的效果差别:
1.对话框顶部有白色块
2.对话框顶部有蓝色线条(部分5.0以下手机)
3.对话框左右边缘与屏幕边缘有间隙
4.背景不是完全透明
5.顶部添加阴影

1.去除对话框顶部有白色块
顶部多出的白色块可以通过调用getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)去除,调用时机可以在onCreateView方法或onActivityCreated方法,

 @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);  // 去掉空白部分
        View inflate = inflater.inflate(R.layout.dialog_test, container, false);
        return inflate;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); // 需在super.onActivityCreated方法前调用
        super.onActivityCreated(savedInstanceState);
    }

效果如下:
Android 继承DialogFragment实现对话框_第3张图片
2.去除对话框顶部蓝色线条
方式一:
通过1中调用getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)可以实现去除。
方式二
如果没有调用getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)
方法,则在5.0以下系统还需调用如下方法去掉(在onStart方法调用):

		  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {  // 对于部分低于5.0系统的手机的对话框顶部出现蓝色线条
                int dividerId = getResources().getIdentifier("android:id/titleDivider", null, null);
                if (dividerId != 0) {
                    View divider = getDialog().findViewById(dividerId);
                    divider.setBackgroundColor(Color.TRANSPARENT);
                }
            }

效果如下:
Android 继承DialogFragment实现对话框_第4张图片
此种方式还需要去title空白区域,可以调用如下方法(在onStart方法中):

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

效果和***1.去除对话框顶部有白色块***一样。

3.去除对话框左右边缘与屏幕边缘间隙
4.设置背景透明
上述两项可通过Window对象重新设置相应的属性来实现。

 @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        Window dialogWindow = dialog.getWindow();
        if (dialogWindow != null) {
            dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  // 设置对话框背景透明,即隐藏title的空白区域
            WindowManager.LayoutParams attributes = dialogWindow.getAttributes();
            attributes.gravity = Gravity.BOTTOM; // 底部显示
            attributes.width = WindowManager.LayoutParams.MATCH_PARENT; // 设置宽度为手机宽度(去除间隙)
            attributes.dimAmount = 0.0f; // 设置背景透明(0-1,0为完全透明,1为不透明)
            dialogWindow.setAttributes(attributes);

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {  // 对于部分低于5.0系统的手机的对话框顶部出现蓝色线条
                int dividerId = getResources().getIdentifier("android:id/titleDivider", null, null);
                if (dividerId != 0) {
                    View divider = dialog.findViewById(dividerId);
                    divider.setBackgroundColor(Color.TRANSPARENT);
                }
            }
        }
    }

效果如下:
Android 继承DialogFragment实现对话框_第5张图片

5.顶部添加阴影
1.通过自定义drawable实现阴影效果(dialog_with_shadow.xml)




    
        
            
        
    
    
 
    
        
            
        
    

 

2.布局引用上面自定的drawable




    
    

        

        

        

        

        

            

            

            

        

    


**备注:**上述布局缺失的资源
color:

    #000000 
    #FFFFFF 
    #DBDBDB 

dimen:

    18sp

你可能感兴趣的:(android)