R.string.alert_dialog_two_buttons_title);
//当需要显示dialog的时候,调用这个方法
newFragment.show(getFragmentManager(), "dialog");
//MyAlertDialogFragment这个类是一个内部的静态类,继承自DialogFragment当调用newFragment.show()这个方法的时候,在android会调用到onCreateDialog方法创建dialog.
//在这个类里面复写呢我Instance()方法和onCreateDialog()方法.
//下面是APIdemo里面的一段代码:
public class FragmentAlertDialog extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_dialog);
View tv = findViewById(R.id.text);
((TextView)tv).setText("Example of displaying an alert dialog with a DialogFragment");
// Watch for button clicks.
Button button = (Button)findViewById(R.id.show);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog();
}
});
}
void showDialog() {
DialogFragment newFragment = MyAlertDialogFragment.newInstance(
R.string.alert_dialog_two_buttons_title);
newFragment.show(getFragmentManager(), "dialog");
}
public void doPositiveClick() {
// Do stuff here.
Log.i("FragmentAlertDialog", "Positive click!");
}
public void doNegativeClick() {
// Do stuff here.
Log.i("FragmentAlertDialog", "Negative click!");
}
public static class MyAlertDialogFragment extends DialogFragment {
public static MyAlertDialogFragment newInstance(int title) {
MyAlertDialogFragment frag = new MyAlertDialogFragment();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(title)
.setPositiveButton(R.string.alert_dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((FragmentAlertDialog)getActivity()).doPositiveClick();
}
}
)
.setNegativeButton(R.string.alert_dialog_cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((FragmentAlertDialog)getActivity()).doNegativeClick();
}
}
)
.create();
}
}
}
以上是DialogFragment的一般使用,使google在新版本中推出的方法,再来看看以前的dialog使用,以下也是APIDEMO里面的代码,但是只取出了其中一部分:
public class AlertDialogSamples extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alert_dialog);
Button twoButtonsTitle = (Button) findViewById(R.id.two_buttons);
twoButtonsTitle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(DIALOG_YES_NO_MESSAGE);
}
});
}
protected Dialog onCreateDialog(int id) {
return new AlertDialog.Builder(AlertDialogSamples.this)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setTitle(R.string.alert_dialog_two_buttons_title)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked OK so do some stuff */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked Cancel so do some stuff */
}
})
.create();
}
很简单,没有dialogfragment中的那么曲折离奇,showDialog()调用传一个ID进取,android系统回调onCreateDialog()方法,根据Id创建不同的dialog.当然这里我把选择判断语句没有copy进来.
看起来dialog使用起来代码量较少,但是为什么google新出了DialogFragment呢?还推荐使用。
我在网上看到这个http://my.oschina.net/fengheju/blog/179218,他提出了一个问题:
当我们点击按钮时,会弹出对话框(内容为android logo),当我们旋转屏幕后,Activity重新创建,整个Activity的界面没有问题,而对话框消失了。
好吧!其实他也在文章中提出了解决方法,保存信息用来恢复场景。但是使用dialogfragment实现的时候就不需要额外的关心这些事情了。
为什么呢?我发现原来Fragment(DialogFragment是fragment派生类)和Activity都存在一个生命周期处理的问题,如果使用DialogFragment创建的对话框,那么它的生命周期管理是和activiy生命周期相关的,当activity的生命周期改变的时候实际上DialogFragment的生命周期在系统中也是会有相应的处理,因此一些需要APP程序员考虑的事情,google帮你在android框架里面做了。
其实DialogFragment还拥有fragment的优点,即可以在一个Activity内部实现回退
back stack是由Activity管理的(昨天晚上刚刚看fragment提到的是Activity管理这个,在activity的类中,还是有一个FragmentManagerImpl对象(FragmentManager的派生类)来处理),fragment还可以使用back stack可以在一个Activity内部实现回退。
关于back stack还没看,看了在补充。