Android 開發之DialogFragment使用
阿新 • • 發佈:2019-02-17
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");
希望能對你有所幫助,筆芯!