在Android系统, 可以使用碎片事务FragmentTransaction 将对话框碎片DialogFragment 显示为碎片,
以下列出一段代码:
public void showDialog (){
MyDialgFragment dialogFragment = MyDialgFragment.newInstance(arg1, arg2);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
dialogFragment.show(transaction, "my-dialog-tag");
}
显示对话框碎片(DialogFragment)的步骤如下:
1. 创建DialogFragment
2. 通过碎片管理器创建对话框事务 FragmentTransaction
3. 使用碎片事务对象显示对话框
自定义的对话框碎片创建时,需要改写以下两个方法之一, 以提供对话框的视图结构,
1 重写View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle b)方法, 返回一个视图View
2 重写 Dialog onCreateDialog(Bundle b) 方法,返回一个对话框Dialog
下面创建一个DialogFragment 示例程序, 来演示DialogFragment的概念.
包括: MainActivity ,PromptDialogFragment, AlertDialogFragment, HelpDialogFragment 类, 一个接口 OnDialogDoneListener,
MainActivity 主要代码:
public class MainActivity extends Activity implements OnDialogDoneListener {
public static final String LOGTAG = "DialogFragmentDemo";
public static String ALERT_DIALOG_TAG = "ALERT_DIALOG_TAG";
public static String HELP_DIALOG_TAG = "HELP_DIALOG_TAG";
public static String PROMPT_DIALOG_TAG = "PROMPT_DIALOG_TAG";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager.enableDebugLogging(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menu_show_alert_dialog:
testAlertDialog();
return true;
case R.id.menu_show_prompt_dialog:
this.testPromptDialog();
return true;
case R.id.menu_help:
testHelpDialog();
return true;
}
return true;
}
private void testPromptDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
PromptDialogFragment pdf = PromptDialogFragment.newInstance("Enter Something");
pdf.show(ft, PROMPT_DIALOG_TAG);
//FragmentOther other = (FragmentOther)this.getFragmentManager()
// .findFragmentByTag("other");
//other.
//CalledFragment m = new CalledFragment();
}
private void testAlertDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
AlertDialogFragment adf = AlertDialogFragment.newInstance("Alert Message");
adf.show(ft, ALERT_DIALOG_TAG);
}
private void testHelpDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
HelpDialogFragment hdf = HelpDialogFragment.newInstance(R.string.help_text);
hdf.show(ft, HELP_DIALOG_TAG);
}
public void onDialogDone(String tag, boolean cancelled, CharSequence message) {
String s = tag + " responds with: " + message;
if(cancelled)
s = tag + " 被取消";
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
}
MainActivity实现了OnDialogDoneListener 接口, 显然重写了onDialogDone(), 这个方法提供了一个调用碎片的标记,表示是否取消了对话框碎片的布尔值, 以及一条消息。
OnDialogDoneListener 接口:
public interface OnDialogDoneListener {
public void onDialogDone(String tag, boolean cancelled, CharSequence message);
}
再看 提醒对话框碎片 AlertDialogFragment类, 此碎片没有布局, 因为AlertBuilder 会提供布局:
public class AlertDialogFragment extends DialogFragment
implements DialogInterface.OnClickListener {
public static AlertDialogFragment newInstance(String message) {
AlertDialogFragment adf = new AlertDialogFragment();
Bundle bundle = new Bundle();
bundle.putString("alert-message",message);
adf.setArguments(bundle);
return adf;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setCancelable(true);
int style = DialogFragment.STYLE_NORMAL, theme = 0;
setStyle(style,theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder b =
new AlertDialog.Builder(getActivity());
b.setTitle("Alert!!");
b.setPositiveButton("Ok", this);
b.setNegativeButton("Cancel", this);
b.setMessage(this.getArguments().getString("alert-message"));
return b.create();
}
public void onClick(DialogInterface dialog, int which) {
OnDialogDoneListener act = (OnDialogDoneListener) getActivity();
boolean cancelled = false;
if (which == AlertDialog.BUTTON_NEGATIVE){
cancelled = true;
}
act.onDialogDone(getTag(), cancelled, "Alert dismissed");
}
}
注意: AlertDialogFragment 与 MainActivity 通过接口实现了从碎片到调用活动的通信.
几点认识:
1. 对话框碎片的 show() 方法接受一个碎片事务作为输入。通过碎片事务来将此对话框添加到Activity中, 然后提交该 碎片事务。 但是, show() 方法没有将该事务添加到后退栈中。如果要这么做,需要先将此事务添加到后退栈,然后将它传递给show(),
2. show() 方法有以下多态形式:
int show(FragmentTransaction ft, String tag) : 通过将此碎片添加到具有指定标记的传入事务中来显示对话框。返回所提交事务的标识符
int show(FragmentManager manager, String tag): 此方法自动化从碎片管理器获取事务的过程。 这是一种快捷方式。 但是此方法无法向后退栈添加事务。 如果需要这么做,请使用第一种方法.
3. 对话框是一个Fragment, 由此所产生的一个优点是: 底层的碎片管理器会执行基本的状态管理。 例如: 即使设备进行了 横竖屏切换,对话框也会再现,而无需执行任何状态管理。