android DialogFragment簡單應用

一個簡單的DialogFragment應用 
因爲Activity的showDialog(int id)被棄用了,要使用DatePickerDialog,TimePickerDialog,AlterDialog都要繼承DialogFragment. 
佈局文件就一個Button,就不寫出來了. 

MainActivity.java 
Java代碼  收藏代碼
  1. package sky.dialog;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8.   
  9. public class MainActivity extends Activity {  
  10.     /** Called when the activity is first created. */  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         Button bt = (Button) findViewById(R.id.showDialog);  
  16.         bt.setOnClickListener(new OnClickListener() {  
  17.               
  18.             @Override  
  19.             public void onClick(View v) {  
  20.                 // TODO Auto-generated method stub  
  21.                 showDialog();  
  22.             }  
  23.         });  
  24.     }  
  25.     public void showDialog()  
  26.     {  
  27.         //根據傳進的參數來實例化DialogFragment.  
  28.         MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.ALTER_DIALOG);  
  29. //      MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.DATE_PICKER_DIALOG);  
  30. //      MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.TIME_PICKER_DiALOG);  
  31.         newDialog.show(getFragmentManager(), "alert msg");  
  32.     }  
  33. }  


MyDialogFragment.java 
Java代碼  收藏代碼
  1. package sky.dialog;  
  2.   
  3. import android.app.DatePickerDialog;  
  4. import android.app.DatePickerDialog.OnDateSetListener;  
  5. import android.app.AlertDialog;  
  6. import android.app.Dialog;  
  7. import android.app.DialogFragment;  
  8. import android.app.TimePickerDialog;  
  9. import android.app.TimePickerDialog.OnTimeSetListener;  
  10. import android.content.DialogInterface;  
  11. import android.os.Bundle;  
  12. import android.widget.DatePicker;  
  13. import android.widget.TimePicker;  
  14.   
  15. public class MyDialogFragment extends DialogFragment {  
  16.     public static final int DATE_PICKER_DIALOG = 1;  
  17.     public static final int ALTER_DIALOG = 2;  
  18.     public static final int TIME_PICKER_DiALOG = 3;  
  19.   
  20.     public static MyDialogFragment newInstance(int title) {  
  21.         MyDialogFragment myDialogFragment = new MyDialogFragment();  
  22.         Bundle bundle = new Bundle();  
  23.         bundle.putInt("title", title);  
  24.         myDialogFragment.setArguments(bundle);  
  25.         return myDialogFragment;  
  26.     }  
  27.   
  28.     @Override  
  29.     public Dialog onCreateDialog(Bundle savedInstanceState) {  
  30.         // TODO Auto-generated method stub  
  31.         int args = getArguments().getInt("title");  
  32.         //根據傳進來的參數選擇創建哪種Dialog  
  33.         switch (args) {  
  34.         case DATE_PICKER_DIALOG:  
  35.             return new DatePickerDialog(getActivity(), new OnDateSetListener() {  
  36.                 public void onDateSet(DatePicker view, int year, int monthOfYear,  
  37.                         int dayOfMonth) {  
  38.                     // TODO Auto-generated method stub  
  39.                     //月是從0開始的  
  40.                     System.out.println( "year-->" + year + "  month-->" + monthOfYear  
  41.                             + "  day-->" + dayOfMonth);  
  42.                 }  
  43.             }, 2012,326);  
  44.         case ALTER_DIALOG:  
  45.             return new AlertDialog.Builder(getActivity())  
  46.                 .setIcon(R.drawable.ic_launcher)  
  47.                 .setTitle(getTag())  
  48.                 .setPositiveButton("ok",  
  49.                         new DialogInterface.OnClickListener() {  
  50.                 public void onClick(DialogInterface dialog, int whichButton) {  
  51.                     //點擊ok觸發的事件  
  52.                     System.out.println("click ok!");  
  53.                 }  
  54.                 })  
  55.             .setNegativeButton("cancle",  
  56.                     new DialogInterface.OnClickListener() {  
  57.                 public void onClick(DialogInterface dialog, int whichButton) {  
  58.                     //點擊cancle觸發的時間  
  59.                     System.out.println("click cancle");  
  60.                 }  
  61.                 })  
  62.                 .create();  
  63.         case TIME_PICKER_DiALOG:  
  64.             return new TimePickerDialog(getActivity(),new OnTimeSetListener() {  
  65.                   
  66.                 public void onTimeSet(TimePicker view, int hourOfDay, int minute) {  
  67.                     // TODO Auto-generated method stub  
  68.                     System.out.println("hour-->"+hourOfDay+"  minute-->"+ minute);  
  69.                 }  
  70.             }, 1323true);  
  71.         }  
  72.         return null;  
  73.     }  
  74.   
  75. }  


=========================================================================================================================

可創建的另一種碎片類型是對話框碎片。一個對話框碎片浮動在活動上方,並且以模態方式顯示。當需要獲得用戶的響應,然後才能繼續執行操作的時候,對話框碎片十分有用。爲了創建一個對話框碎片,需要擴展DialogFragment基類。

下面的“試一試”展示了創建對話框碎片的方法。

試一試 創建並使用一個對話碎片

DialogFragmentExample.zip代碼文件可以在Wrox.com上下載

(1) 使用Eclipse創建一個Android項目,並把它命名爲DialogFragmentExample。

(2) 向包裏添加一個Java類文件並將其命名爲Fragment1。

(3) 使用如下代碼填充Fragment1.java文件。
package net.learn2develop.DialogFragmentExample;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class Fragment1 extends DialogFragment {

     static Fragment1 newInstance(String title) {
          Fragment1 fragment = new Fragment1();
          Bundle args = new Bundle();
          args.putString("title", title);
          fragment.setArguments(args);
          return fragment;
     }

     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
          String title = getArguments().getString("title");
          return new AlertDialog.Builder(getActivity())
          .setIcon(R.drawable.ic_launcher)
          .setTitle(title)
          .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog,
int whichButton) {
                    ((DialogFragmentExampleActivity)
                              getActivity()).doPositiveClick();
               }
          })
          .setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog,
                         int whichButton) {
                    ((DialogFragmentExampleActivity)
                              getActivity()).doNegativeClick();
               }
        }).create();
     }       

}

(4) 使用下列粗體顯示的代碼填充DialogFragmentExampleActivity.java文件。
package net.learn2develop.DialogFragmentExample;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DialogFragmentExampleActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
       
          Fragment1 dialogFragment = Fragment1.newInstance(
                    "Are you sure you want to do this?");
               dialogFragment.show(getFragmentManager(), "dialog");  
     }
   
     public void doPositiveClick() {
          //---perform steps when user clicks on OK---
          Log.d("DialogFragmentExample", "User clicks on OK");
     }

     public void doNegativeClick() {
          //---perform steps when user clicks on Cancel---
          Log.d("DialogFragmentExample", "User clicks on Cancel");
     }

}

(5) 按F11鍵在Android模擬器上調試應用程序。圖4-26所示的碎片在一個警告對話框中顯示。單擊OK按鈕或Cancel按鈕,觀察顯示的消息。

示例說明

爲創建一個對話碎片,首先Java類要擴展DialogFragment基類:

public class Fragment1 extends DialogFragment{
}

在本例中,創建了一個警告對話框,這是一個顯示一條消息及可選按鈕的對話框窗口。在Fragment1類中,定義了newInstance()方法:
    static Fragment1 newInstance(String title) {
         Fragment1 fragment = new Fragment1();
         Bundle args = new Bundle();
         args.putString("title", title);
         fragment.setArguments(args);
         return fragment;
    }

newInstance()方法允許創建碎片的一個新實例,同時它接受一個指定警告對話框中要顯示的字符串(title)的參數。title隨後存儲在一個Bundle對象裏供之後使用。

接下來定義了onCreateDialog()方法,該方法在onCreate()之後、onCreateView()之前調用:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
     String title = getArguments().getString("title");
        return new AlertDialog.Builder(getActivity())
        .setIcon(R.drawable.ic_launcher)
        .setTitle(title)
        .setPositiveButton("OK",
                  new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog,
                       int whichButton) {
                  ((DialogFragmentExampleActivity)
                            getActivity()).doPositiveClick();
             }
        })
        .setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog,
int whichButton) {
                  ((DialogFragmentExampleActivity)
getActivity()).doNegativeClick();
             }
        }).create();
   }     

在這裏,創建的警告對話框有兩個按鈕:OK和Cancel。要在該對話框中顯示的字符串從保存在Bundle對象中的title參數中獲取。

爲了顯示對話框碎片,創建它的一個實例並調用它的show()方法:
    Fragment1 dialogFragment = Fragment1.newInstance(
               "Are you sure you want to do this?");
          dialogFragment.show(getFragmentManager(), "dialog"); 
 
還需要實現兩種方法:doPostiveClick()和doNegativeClick(),分別用於處理用戶單擊OK按鈕或Cancel按鈕的情況。
     public void doPositiveClick() {
          //---perform steps when user clicks on OK---
          Log.d("DialogFragmentExample", "User clicks on OK");
     }

     public void doNegativeClick() {
          //---perform steps when user clicks on Cancel---
          Log.d("DialogFragmentExample", "User clicks on Cancel");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章