1. 程式人生 > >Android 開發之DialogFragment使用

Android 開發之DialogFragment使用

DialogFragment是有谷歌推出的致力於取代dialog的控制元件,它繼承於Fragment,也是有生命週期的。

因為新專案是由我來獨立開發,於是就想趁著此次機會來嘗試試用一下。

首先,第一步,要新建一個java類,整合自DialogFragment,重寫其onCreateView方法,在此方法中載入自定義佈局檔案。

佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:text="這是一個DialogFragment"/>

    <Button
        android:layout_marginTop="20dp"
        android:id="@+id/btn_dialog_colse"
        android:layout_width="200dp"
        android:text="關閉"
        android:layout_height="match_parent" />

</LinearLayout>

DialogFragment 程式碼:

public class ShowDialog extends DialogFragment {

    private View view;
    private Button btn_dialog_colse;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        if (view == null){
            view = inflater.inflate(R.layout.dialog_show,container);
            btn_dialog_colse = view.findViewById(R.id.btn_dialog_colse);
        }

        return view;

    }
}

接下來是在程式碼中呼叫:

ShowDialog showDialog = new ShowDialog();
showDialog.show(getFragmentManager(),"show");

好了,到現在為止,我們已經完成了一個dialogFragment的使用。

執行一下,檢視效果:

但是如果我們把背景設定為帶圓角的shape,就會看出問題來:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <corners android:radius="30dp"/>
    <solid android:color="@color/blue33"/>

</shape>

這效果看著有點辣眼睛,簡單來說就是我們設定的背景並未起作用。解決辦法很簡單,在ShowDialog里加一句話:

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//設定背景為透明

在Android 低版本上還會遇到標題欄,解決辦法是在程式碼中進行隱藏:

getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

這兩句程式碼要加在onCreatView中,初始化佈局之前。

現在再次檢視結果:背景已經沒了。

這個現象比之前要好的多。

如果我們希望再開啟dialog的時候,順帶傳遞引數,再dialogfragment內接受引數,要如何做呢?

我們可以通過bundle來實現:

                ShowDialog showDialog = new ShowDialog();
                Bundle bundle = new Bundle();
                bundle.putString("name","123");
                bundle.putInt("age",13);
                showDialog.setArguments(bundle);
                showDialog.show(getFragmentManager(),"show");

再dialog頁面中接受引數:

String name = getArguments().getString("name");
int age = getArguments().getInt("age");
LogUtil.Log_i(name+":"+age);

 檢視一下列印結果,說明我們已經成功將引數傳遞。

 補充一點,在個別裝置上我們會發現在xml中指定的佈局寬高和我們期望的不一致,此時需要我們在java檔案中來進行修正,在onStart方法中加入程式碼:

@Override
public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null) {
            DisplayMetrics dm = new DisplayMetrics();
//設定彈框的佔屏寬        getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
//dialog.getWindow().setLayout((int) (dm.widthPixels * 0.5),ViewGroup.LayoutParams.WRAP_CONTENT);
            dialog.getWindow().setLayout((int) (ViewGroup.LayoutParams.WRAP_CONTENT), ViewGroup.LayoutParams.WRAP_CONTENT);
        }
    }

 dialog的簡單使用到這裡就告一段落,附dialog的完整程式碼:

public class ShowDialog extends DialogFragment {

    private View view;
    private Button btn_dialog_colse;

    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null) {
            DisplayMetrics dm = new DisplayMetrics();
//設定彈框的佔屏寬getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
//dialog.getWindow().setLayout((int) (dm.widthPixels * 0.5), ViewGroup.LayoutParams.WRAP_CONTENT);
            dialog.getWindow().setLayout((int) (ViewGroup.LayoutParams.WRAP_CONTENT), ViewGroup.LayoutParams.WRAP_CONTENT);
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//設定背景為透明

        if (view == null){
            view = inflater.inflate(R.layout.dialog_show,container);
            btn_dialog_colse = view.findViewById(R.id.btn_dialog_colse);
        }

        String name = getArguments().getString("name");
        int age = getArguments().getInt("age");
        LogUtil.Log_i(name+":"+age);

        return view;

    }
}

程式碼中呼叫時:

 ShowDialog showDialog = new ShowDialog();
 Bundle bundle = new Bundle();
 bundle.putString("name","123");
 bundle.putInt("age",13);
 showDialog.setArguments(bundle);
 showDialog.show(getFragmentManager(),"show");

希望能對你有所幫助,筆芯!