DialogFragment 实践

来源:互联网 发布:淘宝地址怎么删除不了 编辑:程序博客网 时间:2024/05/17 22:09

1.概述
第一次听说diaologFragment,今天找了一下,这里根据鸿神的博客实践下,做下记录,供下次使用:
2.dialogFragment 简介
dialogFragment是Android3.0推出的用于优化dialog显示,因为dialgog显示存在以下两个问题:
1.由于dialog显示依存于activity,所以当屏幕旋转的时候,dialog会重新创建,这就造成了用户输入的内容无法保存,而dialogFragment与fragment具有基本一致的生命周期,FragmentManager会自己管理Fragment的生命周期,在旋转的过程中,打印的log

E/MyDialogFragment: onAttachE/MyDialogFragment: onCreateDialogD/HwSensorManager: HwSensorManager version: 1.0.0E/MyDialogFragment: onCreateViewE/MyDialogFragment: onStartE/MyDialogFragment: onResumeE/MyDialogFragment: onPauseE/mainActivity: onPauseE/MyDialogFragment: onStopE/mainActivity: onStopE/MyDialogFragment: onDestroyE/mainActivity: onDestroyE/MyDialogFragment: onAttachE/mainActivity: onCreateE/MyDialogFragment: onCreateDialogE/MyDialogFragment: onCreateViewE/MyDialogFragment: onStartE/mainActivity: onStartE/mainActivity: onResumeE/MyDialogFragment: onResume

由此可知,dialogfragment也是重新创建了一遍,
2.dialogFragment是一个自成一体的东西,dialog放在activity里面,会严重影响activity的逻辑和显示,所以使用dialogFragemnt便于管理,

3.1onCreateView简单使用
3.1.1 layout布局资源,两个edittext,一个button,线性布局竖直排列

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="@string/dialog_login_input_user"/>    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="@string/dialog_login_input_pwd"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/dialog_login_btn_login"        android:onClick="click"/></LinearLayout>

3.1.2 重写 onCreatview dialogFragement中加载布局,

public class MyDialogFragment extends DialogFragment{    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.dialog_fragment_login, container, false);        Log.e("MyDialogFragment","onCreateView");        return view;    }

3.1.3 mainActivity 中展示

//mainActivity中的点击事件,主要就是myDialogFragment的show()函数 public void click(View v){        MyDialogFragment myDialogFragment = new MyDialogFragment();        myDialogFragment.show(getSupportFragmentManager(),"mydialog");    }

这样展示会显示标题,所以我们可以将标题去了,方法很简单,在onCreateView中调用

getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

这就完成展示了,但是,经过实践,这种方法并不能保存dialogFragment中的数据,下面我们探索第二种方式
ps:上面的layout布局中采用的是线性布局,去除标题之后展示效果如下:
这里写图片描述
但是改为相对布局之后,就可以了,原因不明,还望大神指教
这里写图片描述
*3.2onCreateDialog方法
3.1的方式,主要用于自定义的dialog,那样我们可以随心所欲的自定义的dialog,oncreateDialog()函数是DialogFragment独有的,目的是为我们提供一种快捷的创建dialog的方式,
3.2.1 layout的资源,沿用上面的,不过去掉button,因为dialog可以直接设置button啊

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="wrap_content"              android:layout_height="wrap_content">    <EditText        android:id="@+id/et1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="@string/dialog_login_input_user"/>    <EditText        android:id="@+id/et2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@id/et1"        android:hint="@string/dialog_login_input_pwd"/>    <!--<Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/dialog_login_btn_login"        android:layout_below="@id/et2"        android:onClick="click"/>--></RelativeLayout>

3.2.2 oncreateDialog中创建dialog,

@NonNull    @Override    public Dialog onCreateDialog(Bundle savedInstanceState) {        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());        builder.setView(View.inflate(getActivity(),R.layout.dialog_fragment_login,null)).setTitle(R.string.title).setPositiveButton(R.string.btn, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                Toast.makeText(getActivity(),R.string.btn,Toast.LENGTH_SHORT).show();            }        });        AlertDialog alertDialog = builder.create();        // 注意这里返回的是一个alertDialog对象,因为要求的就是返回一个dialog对象啊        return alertDialog;    }

3.2.3 mainActivity中show

public void click(View v){        MyDialogFragment myDialogFragment = new MyDialogFragment();        myDialogFragment.show(getSupportFragmentManager(),"mydialog");    }

这种方式,dialog的内容就可以保存了,只能归结于Android系统后面做了优化吧
这个dialog怎么向activity传递数据,当热是回调啊,比较简单,这里就不在赘述
4.在小屏幕展示dialog,在大屏幕上内嵌组件
4.1

0 0
原创粉丝点击