Fragment之8_____DialogFragment

在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,  由此所产生的一个优点是:  底层的碎片管理器会执行基本的状态管理。 例如: 即使设备进行了 横竖屏切换,对话框也会再现,而无需执行任何状态管理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值