Android DialogFragment中使用的一些細節處理

DialogFragment全屏

默認來說DialogFragment是不全屏的,需要以下代碼進行設置

    /**
     * Activity創建後纔會有window
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //設置全屏
        getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }

外側背景透明問題

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));//需要這一行來解決對話框背景有白色的問題(顏色隨主題變動)
    }

DialogFragment實例問題

不管對話框顯示多少次,都用同一個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進行顯示的時候都會執行這個方法獲取參數
        }
    }

對話框全局按鍵監聽

設置對話框內全局按鍵監聽,當對話框顯示時候,所有遙控器按鍵均可以監聽

    @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;
            }
        });
    }

DialogFragment空白處禁止點擊

點擊空白處禁止關閉

1、
setCanceledOnTouchOutside(false):調用這個方法時,按對話框以外的地方不起作用。按返回鍵還起作用。

setCanceledOnTouchOutside(true):點擊灰色空白處關閉彈框。

2、
setCanceleable(false);調用這個方法時,按對話框以外的地方不起作用。按返回鍵也不起作用

 

注意:setCanceledOnTouchOutside(true)如果需要起作用,不能設置setCanceleable(false),如果設置爲false,則不起作用。

DialogFragment的show()與setArgums()的關係

當我們調用show()函數的時候對話框才顯示,如果我們需要在show()的時候傳遞參數進去並進行處理時需要在onShow()裏面獲取Argums參數

 @Override
    public void show(FragmentManager manager, String tag) {
        super.show(manager, tag);
        Bundle bundle = getArguments();
    }

注意:onShow()執行時機要比onCreate()執行的早

參考鏈接

  1. DialogFragment的使用
    https://developer.android.google.cn/reference/kotlin/android/app/DialogFragment?hl=en
  2. Android–>Dialog/DialogFragment寬度高度修改/全屏,自定義樣式
    https://www.jianshu.com/p/c094d8038b24
  3. 給DialogFragment設置樣式:
    https://blog.csdn.net/ttkatrina/article/details/54984375
  4. Android DialogFragment
    https://blog.csdn.net/as89751/article/details/97581729
  5. DialogFragment 的使用和一些坑點
    https://blog.csdn.net/little_story/article/details/81437013
  6. Android DialogFragment 的常用屬性
    https://blog.csdn.net/weixin_37716758/article/details/101207339
  7. 還在用Dialog嗎——DialogFragment帶你體驗完美高效率
    https://blog.csdn.net/androidstarjack/article/details/73824885
  8. 最全面的DialogFragment的使用,實現DialogFragment全屏、背景透明;
    https://blog.csdn.net/weixin_30824479/article/details/98609945
  9. Android 關於DialogFragment的充滿及點擊背景穿透
    https://blog.csdn.net/Keepsty/article/details/81359459
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章