ApiDemos--FragmenAlertDialog的例子分析
Android里提供了一个DialogFragment供大家使用,大家可以使用这个Fragment类来创建自己的Dialog,至于为什么使用这个Fragment而不使用Dialog,原因在于Fragment的高度灵活性,可扩展性。
为了演示如何显示一个具有AlertDialog风格的Fragment,我们先来创建一个用来显示Fragmemnt的Activity,命名为FragmentAlertDialog,代码如下:
public class FragmentAlertDialog extends Activity {
}
我们需要继承Activity的onCreate()函数,来指定布局。
@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");
}
这个函数创建了一个DialogFragment类型的MyAlertDialogFragment,源码如下:
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();
}
}
为了显示一个警告对话框形式的Fragment,只需在onCreateDialog()回调方法里返回一个AlertDialog即可,很简单。最后显示效果如下: