因爲Activity的showDialog(int id)被棄用了,要使用DatePickerDialog,TimePickerDialog,AlterDialog都要繼承DialogFragment.
佈局文件就一個Button,就不寫出來了.
MainActivity.java
- package sky.dialog;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button bt = (Button) findViewById(R.id.showDialog);
- bt.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showDialog();
- }
- });
- }
- public void showDialog()
- {
- //根據傳進的參數來實例化DialogFragment.
- MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.ALTER_DIALOG);
- // MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.DATE_PICKER_DIALOG);
- // MyDialogFragment newDialog = MyDialogFragment.newInstance(MyDialogFragment.TIME_PICKER_DiALOG);
- newDialog.show(getFragmentManager(), "alert msg");
- }
- }
MyDialogFragment.java
- package sky.dialog;
- import android.app.DatePickerDialog;
- import android.app.DatePickerDialog.OnDateSetListener;
- import android.app.AlertDialog;
- import android.app.Dialog;
- import android.app.DialogFragment;
- import android.app.TimePickerDialog;
- import android.app.TimePickerDialog.OnTimeSetListener;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.widget.DatePicker;
- import android.widget.TimePicker;
- public class MyDialogFragment extends DialogFragment {
- public static final int DATE_PICKER_DIALOG = 1;
- public static final int ALTER_DIALOG = 2;
- public static final int TIME_PICKER_DiALOG = 3;
- public static MyDialogFragment newInstance(int title) {
- MyDialogFragment myDialogFragment = new MyDialogFragment();
- Bundle bundle = new Bundle();
- bundle.putInt("title", title);
- myDialogFragment.setArguments(bundle);
- return myDialogFragment;
- }
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- int args = getArguments().getInt("title");
- //根據傳進來的參數選擇創建哪種Dialog
- switch (args) {
- case DATE_PICKER_DIALOG:
- return new DatePickerDialog(getActivity(), new OnDateSetListener() {
- public void onDateSet(DatePicker view, int year, int monthOfYear,
- int dayOfMonth) {
- // TODO Auto-generated method stub
- //月是從0開始的
- System.out.println( "year-->" + year + " month-->" + monthOfYear
- + " day-->" + dayOfMonth);
- }
- }, 2012,3, 26);
- case ALTER_DIALOG:
- return new AlertDialog.Builder(getActivity())
- .setIcon(R.drawable.ic_launcher)
- .setTitle(getTag())
- .setPositiveButton("ok",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- //點擊ok觸發的事件
- System.out.println("click ok!");
- }
- })
- .setNegativeButton("cancle",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- //點擊cancle觸發的時間
- System.out.println("click cancle");
- }
- })
- .create();
- case TIME_PICKER_DiALOG:
- return new TimePickerDialog(getActivity(),new OnTimeSetListener() {
- public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
- // TODO Auto-generated method stub
- System.out.println("hour-->"+hourOfDay+" minute-->"+ minute);
- }
- }, 13, 23, true);
- }
- return null;
- }
- }
=========================================================================================================================
可創建的另一種碎片類型是對話框碎片。一個對話框碎片浮動在活動上方,並且以模態方式顯示。當需要獲得用戶的響應,然後才能繼續執行操作的時候,對話框碎片十分有用。爲了創建一個對話框碎片,需要擴展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");
}