Fragment裏面創建DialogFragment對話框

                                                            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)

區別是第一個進入事務中,同時進入返回棧

第二個只是獲得一個事務進行顯示。

 

碎片對話框的好處是:即使設備發生旋轉,碎片管理器會執行基本的狀態管理,我們不需要做任何的狀態管理,對話框就會重建。