今天看Android文档的时候看到了DialogFragment,感兴趣就按照自己的理解做了个例子,也不清楚用的对不对,倒是可以正常运行,其中
也发现了一个bug,也请高手解决一下,大家也分享DialogFragment是不是应该这么用~
1.第一个就是普通的使用方式
先写个DialogFragment类
public static class FireMissilesDialogFragment extends DialogFragment { /** * 创建Fragment对话框实例 * * @param title:指定对话框的标题。 * @return:Fragment对话框实例。 */ public static FireMissilesDialogFragment newInstance(String title) { FireMissilesDialogFragment frag = new FireMissilesDialogFragment(); Bundle args = new Bundle(); // 自定义的标题 args.putString("title", title); frag.setArguments(args); return frag; } /** * 覆写Fragment类的onCreateDialog方法,在DialogFragment的show方法执行之后, 系统会调用这个回调方法。 */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 获取对象实例化时传入的窗口标题。 String title = getArguments().getString("title"); // 用builder创建对话框 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(title); builder.setPositiveButton("fire", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // FIRE ZE MISSILES! } }); builder.setNegativeButton("cancle", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // 创建一个dialog对象并返回 return builder.create(); } }
FireMissilesDialogFragment fire = FireMissilesDialogFragment.newInstance("fire_missiles?"); fire.show(getFragmentManager(), "dialog");
首先是类,其中包含了一个接口
public class NoticeDialogFragment extends DialogFragment { // 使用这个接口的实例提供行动的事件 NoticeDialogListener mListener; /** * 实现这个接口的类需要实现这两个方法 */ public interface NoticeDialogListener { public void onDialogPositiveClick(DialogFragment dialog); public void onDialogNegativeClick(DialogFragment dialog); } /** * 覆盖Fragment.onAttach()这个函数来处理NoticeDialogListener实例 */ @Override public void onAttach(Activity activity) { super.onAttach(activity); // 校验主Activity实现回调接口 try { // 获得NoticeDialogListener实例,这样我们就能将事件发送到主Activity mListener = (NoticeDialogListener) activity; } catch (ClassCastException e) { // activity没有实现这个接口则抛出异常 throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); } } /** * 覆写Fragment类的onCreateDialog方法,在DialogFragment的show方法执行之后, 系统会调用这个回调方法。 */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 创建dialog并设置button的点击事件 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("fire_missiles").setPositiveButton("fire", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // Send the positive button event back to the host activity mListener.onDialogPositiveClick(NoticeDialogFragment.this); } }).setNegativeButton("cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // Send the negative button event back to the host activity mListener.onDialogNegativeClick(NoticeDialogFragment.this); } }); return builder.create(); }
实现接口的方法
/** * 继承接口所需要实现的函数,即按钮的触发事件 */ @Override public void onDialogPositiveClick(DialogFragment dialog) { // 点击确定按钮的触发事件 Toast.makeText(SecondActivity.this, "you chose fire", Toast.LENGTH_SHORT).show(); } @Override public void onDialogNegativeClick(DialogFragment dialog) { // 点击取消按钮的触发事件 Toast.makeText(SecondActivity.this, "you chose cancle", Toast.LENGTH_SHORT).show(); }
// 创建DialogFragment对象,并显示 NoticeDialogFragment dialog = new NoticeDialogFragment(); dialog.show(getFragmentManager(), "NoticeDialogFragment");
首先定义DialogFragment类
public class CustomDialogFragment extends DialogFragment { private Button cancleBtn; private Button okBtn; /** * 通过系统判断DialogFragment的显示形式,不论是以Dialog的形式显示,还是嵌入的Fragment显示 */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 获得视图 View view = inflater.inflate(R.layout.purchase_items, container, false); cancleBtn = (Button) view.findViewById(R.id.cancle_btn); okBtn = (Button) view.findViewById(R.id.ok_btn); cancleBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); okBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getActivity(), "you chose ok!", Toast.LENGTH_SHORT).show(); dismiss(); } }); return view; } /** * The system calls this only when creating the layout in a dialog. 当创建Dialog的时候系统将会调用 */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { /** * 你唯一可能会覆盖这个方法的原因就是当使用onCreateView()去修改任意Dialog特点的时候。例如, * dialog都有一个默认的标题,但是使用者可能不需要它。因此你可以去掉标题,但是你必须调用父类去获得Dialog。 */ Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFBB33" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="this is the test" android:textSize="20sp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" > <Button android:id="@+id/cancle_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="cancle" /> <Button android:id="@+id/ok_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="ok" /> </LinearLayout> </RelativeLayout>
FragmentManager fragmentManager = getFragmentManager(); CustomDialogFragment newFragment = new CustomDialogFragment(); if (mIsLargeLayout) { // 屏幕较大,以Dialog的形式显示 newFragment.show(fragmentManager, "dialog"); } else { // 屏幕较小,以全屏形式显示 FragmentTransaction transaction = fragmentManager.beginTransaction(); // 指定一个过渡动画 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); // 作为全屏显示,使用“content”作为fragment容器的基本视图,这始终是Activity的基本视图 transaction.add(android.R.id.content, newFragment).addToBackStack(null).commit(); }
另外,还要在values, values-sw600dp等文件夹中加入bools.xml文件,以判断屏幕分辨率
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="large_layout">false</bool> </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="large_layout">true</bool> </resources>
最后是相应的源码,另外还添加了一些一般Dialog的使用示例~
源码下载