最全面的DialogFragment的使用,實現DialogFragment全屏、背景透明;


Android推薦使用DialogFragment代替Dialog,好處就說一點吧,DialogFragment就是個蓋在界面上的Fragment,它擁有Fragment一樣的功能和生命周期,解決普通Dialog旋轉屏幕后異常的問題;

使用DialogFragment實現網易雲音樂下載完成全局提醒、主流APP底部選擇彈框;Github DialogFragmentDemo源碼  完整的代碼在Github上面,歡迎Star!!!

1、使用方法一、

public class CustomViewDialog extends DialogFragment {
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_view1,container);
    }
}

//在Activity或Fragment中:

 new CustomViewDialog().show(getSupportFragmentManager(),"2'");

2、使用方式二、

public class DialogTypeDialog extends DialogFragment {

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("提示")
                .setMessage("重寫onCreateDialog其他就和Dialog設置方式相同,可以設置view或者dialog中設置setContentView和其他事件")
                .setPositiveButton("確定", null)
                .setNegativeButton("取消", null);
        return builder.create();
    }
}

3、全屏顯示Dialog:

Dialog有邊距不能全屏的原因是因為源碼中給Dialog的Window設置了Padding值,兩種方法可以讓其全屏:

①:DialogFragment全屏方式一:

   // 最主要就是這句 windowIsFloating = false 
   <style name="DialogFullScreen" parent="Theme.AppCompat.Dialog">
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
    </style>
//在DialogFragment中

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE,R.style.DialogFullScreen); //dialog全屏
    }

②:DialogFragment全屏方式二、

    //在DialogFragment中
     @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //去掉dialog的標題,需要在setContentView()之前
        this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = this.getDialog().getWindow();
        //去掉dialog默認的padding
        window.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.MATCH_PARENT;
        window.setAttributes(lp);
        final View view = inflater.inflate(R.layout.dialog_view2, null); //自己的布局文件

        return view;
    }

4、仿網易雲音樂,任務下載完畢的提示:

/**
 * CCB:頂部顯示、全屏、寬度全屏、高度自定義、背景全透明;
 * 仿網易雲音樂下載完成提示;
 */
public class TopDialog extends DialogFragment {

    private LinearLayout ll;
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
       View dialogView = inflater.inflate(R.layout.top_dialog,container); //顯示的布局
       ll = dialogView.findViewById(R.id.mView);
       FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) ll.getLayoutParams();
       params.topMargin = getStatusBarHeight(getDialog().getContext());
       ll.setLayoutParams(params); //默認在最頂部,把狀態欄部分留出來
        return dialogView;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE,R.style.DialogFullScreen); //dialog全屏
    }


    @Override
    public void onStart() {
        super.onStart();
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams windowParams = window.getAttributes();
        windowParams.dimAmount = 0.0f;//Dialog外邊框透明
        window.setLayout(-1, -2); //高度自適應,寬度全屏
        windowParams.gravity = Gravity.TOP; //在頂部顯示
        windowParams.windowAnimations = R.style.TopDialogAnimation;
        window.setAttributes(windowParams);
    }

    /**
     * 獲取狀態欄高度(單位:px)
     */
    public static int getStatusBarHeight(Context context) {
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
        return resources.getDimensionPixelSize(resourceId) == 0 ? 60 : resources.getDimensionPixelSize(resourceId);
    }

}

顯示時從頂部向下位移、隱藏是由當前位置向上唯一、動畫效果:

   //注:style中 
   <style name="TopDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/dialog_top_show</item>
        <item name="android:windowExitAnimation">@anim/dialog_top_hide</item>
    </style>

//注:dialog_top_show
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromYDelta="-100%p"
        android:toYDelta="0%p"/>
</set>

//注:dialog_top_hide
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromYDelta="0%p"
        android:toYDelta="-100%p"/>
</set>

5、仿淘寶選擇拍照或相冊的底部彈框:

public class BottomDialog extends DialogFragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //去掉dialog的標題,需要在setContentView()之前
        this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = this.getDialog().getWindow();
        //去掉dialog默認的padding
        window.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        //設置dialog的位置在底部
        lp.gravity = Gravity.BOTTOM;
        //設置dialog的動畫
        lp.windowAnimations = R.style.BottomDialogAnimation;
        window.setAttributes(lp);
        window.setBackgroundDrawable(new ColorDrawable());

        final View view = inflater.inflate(R.layout.dialog_view2, null);

        return view;
    }
}

淘寶選擇底部彈框動畫效果:

   //注:style中 
     <style name="BottomDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/dialog_bottom_up</item>
        <item name="android:windowExitAnimation">@anim/dialog_bottom_down</item>
    </style>

//注:dialog_bottom_up
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="0"
        android:fromYDelta="100%p"/>
</set>

//注:dialog_bottom_down
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromYDelta="0"
        android:toYDelta="100%p"/>
</set>

布局文件等等的就不貼過來了,詳細請看Github DialogFragmentDemo源碼  完整的代碼在Github上面,歡迎Star!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM