AUF法則下的對話框
【楔子】 在Actiity頁面上做DiaLog似乎非常簡單,大部分在學習了控件以後都會使用,但是google希望開發者只使用FragementDialog,剛開始不理解,後來發現碎片對話框真的太好用了,完全就是自我定製,其實就是設計一個xml佈局,然後將它顯示爲對話框,這種自由形的對話框自然要比Activity本身的要好上很多。
【DialogFragment基礎知識】想要做碎片的對話框,需要了解DialogFragment類,這個類繼承自Fragment,所以行爲相似。
【實現效果】:在一個fragment裏面點擊島計時,跳出對話框
【第一步建立DialogFragment】
首先如同Fragment一樣建立dialog.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="110dp" android:textSize="30dp" android:text="時" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="45dp" android:textSize="30dp" android:text="分" /> </LinearLayout> <TimePicker android:id="@+id/mytime" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/timesure" android:layout_width="200dp" android:layout_height="wrap_content" android:background="#33A18F" android:textColor="#FFFFFF" android:layout_marginBottom="20dp" android:text="確定" /> </LinearLayout>
接下來就是DialogFragment類:
package com.example.testdrawerlayoutleft; import android.app.Activity; import android.app.DialogFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; import android.widget.Toast; public class TimeDialog extends DialogFragment{ private TimePicker mytime=null; private Button timesubmit; public int hour; public int minute; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setTitle("倒計時"); View view=inflater.inflate(R.layout.dialog, container); mytime=(TimePicker)view.findViewById(R.id.mytime); timesubmit=(Button)view.findViewById(R.id.timesure); timesubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub OnFragmentListener listener=(OnFragmentListener)getActivity(); listener.onFragmentListener(hour, minute); getDialog().dismiss(); } }); mytime.setIs24HourView(true); mytime.setCurrentHour(13); mytime.setCurrentMinute(14); mytime.setOnTimeChangedListener(new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute1) { // TODO Auto-generated method stub hour=hourOfDay; minute=minute1; Toast.makeText(getActivity(), hour+" "+minute, 100).show(); } }); return view; } }
關鍵代碼:
public class TimeDialog extends DialogFragment
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
【點擊事件中的Fragment處理】:
監聽radiobutton事件:
countdown.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub main.showDialog("dialog"); } });
其中main就是主Activity,獲取方式如下:
Main main = (Main) getActivity();
管理對話框顯示方式還是寫在主Activity裏面:
public void showDialog(String tag){ TimeDialog dialog=new TimeDialog(); dialog.show(getFragmentManager(), tag); }
這裏就全部完成了,是不是比較簡單?
碎片對話框顯示方式有兩種
1.public int show(FragmentTransaction transaction ,String tag)
2.public int show(Fragment manager, String tag)
區別是第一個進入事務中,同時進入返回棧
第二個只是獲得一個事務進行顯示。
碎片對話框的好處是:即使設備發生旋轉,碎片管理器會執行基本的狀態管理,我們不需要做任何的狀態管理,對話框就會重建。