zoukankan      html  css  js  c++  java
  • Android开发——官方推荐使用DialogFragment替换AlertDialog

    0.  前言

    DialogFragment是在Android3.0(API level 11)中引入,代替了已经不建议使用的AlertDialog

    为什么不再建议使用AlertDialog了呢?我们先得清楚DialogFragment存在的意义。本文原创,转载请注明出处为SEU_Calvin的博客

    1DialogFragmentFragment基本一致的生命周期,因此当旋转屏幕和按下后退键时便于Activity更好的管理其生命周期

    2)比如当屏幕旋转时,AlertDialog会消失,更不会保存如EditText上的文字,如果处理不当很可能引发异常,因为Activity销毁前不允许对话框未关闭。而DialogFragment对话框会随之自动调整对话框大小。DialogFragment的出现完美的解决了横竖屏幕切换Dialog消失的问题,同时也有恢复数据的功能。

     

    1.  AlertDialog的使用

    这种方式是我以前使用的,既然不建议使用,那就尽量少用吧。但是感觉比DialogFragment要简单一些。代码直接在Activity中就能完成。下面是一个让用户输入密码的对话框例子。

     private AlertDialog dialog;
        private void showEnterDialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            View view = View.inflate(MainActivity.this, R.layout.fragment_login_dialog, null);
            ok = (Button) view.findViewById(R.id.ok);
            cancel = (Button) view.findViewById(R.id.cancel);
            cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            ok.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //取出密码并验证的逻辑略
                    dialog.dismiss();
                }
            });
            dialog = builder.create();
            dialog.setView(view, 0, 0, 0, 0);
            dialog.show();
    }
    

    效果如下所示,看起来还不错,但是旋转屏幕后对话框就消失了。针对这个问题,还是建议使用DialogFragment来做对话框。



    2.  DialogFragment的使用——继承DialogFragment并实现onCreateDialog

    DialogFragment有两种使用方式,第一种是写一个类继承DialogFragment并且实现它的onCreateDialog方法来创建一个DialogFragment,在onCreateDialog中一般使用AlertDialog创建并返回一个对话框。

    public class AlertDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            LayoutInflater inflater = getActivity().getLayoutInflater();
            //这里使用的布局文件和1中的一样,只是去掉了两个按钮
            View view = inflater.inflate(R.layout.fragment_login_dialog, null);
            builder.setView(view).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {}
               }).setNegativeButton("Cancel", null);
            return builder.create();
        }
    }
    

    接下来就是在Activity中使用它:

    FragmentTransaction mFragTransaction = getFragmentManager().beginTransaction();
    Fragment fragment =  getFragmentManager().findFragmentByTag("dialogFragment");
    if(fragment!=null){
        //为了不重复显示dialog,在显示对话框之前移除正在显示的对话框
        mFragTransaction.remove(fragment);
    }
    AlertDialogFragment dialogFragment = new AlertDialogFragment();
    //显示一个Fragment并且给该Fragment添加一个Tag,可通过findFragmentByTag找到该Fragment
    dialogFragment.show(mFragTransaction, "dialogFragment");
    

    效果如下所示,还是不错的,旋转屏幕后对话框也不会消失,如果有文字也会被保存:



    3.  DialogFragment的使用——继承DialogFragment并实现它的onCreateView

    DialogFragment的第二种使用方式是继承DialogFragment并且实现它的onCreateView方法来加载一个我们指定的xml布局从而提供对话框内容。这里需要注意的是如果没有调用下面的第四行代码,加载出来的对话框会默认出现一个标题,查看DialogFragment的源码可以发现它内部是mDialog.setContentView(view);把我们的xml布局加载到DialogContent内容区域。或许你不想去除标题,反而想要在标题区域显示你设置的标题,那么可以使用getDialog().setTitle("这是标题");本文原创,转载请注明出处为SEU_Calvin的博客

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            //去掉默认的标题
            getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
            View view = inflater.inflate(R.layout.fragment_login_dialog, container);
            ok = (Button) view.findViewById(R.id.ok);
            cancel = (Button) view.findViewById(R.id.cancel);
            cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getDialog().dismiss();
                }
            });
            ok.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getDialog().dismiss();
                }
            });
            return view;
        }
    

    Activity中的简易使用如下,效果和1中的是一样的。但是屏幕的旋转丝毫不会影响到对话框。

    AlertDialogFragment alertDialogFragment = new AlertDialogFragment();
    alertDialogFragment.show(getFragmentManager(), "EditNameDialog");
    

    4.  使用接口回调实现DialogFragmentActivity的通信

    以第一种实现它的onCreateDialog方法为例,只需定一个如下的接口,并在点击OK的逻辑中,回调接口的方法传入获取用户输入,即可在实现了该接口的Activity中得到这些数据。

    public interface LoginInputListener  {  
        void onLoginIn (String password);  
    }  
    LoginInputListener listener = (LoginInputListener) getActivity();  
    listener. onLoginIn (mPassword.getText().toString()); 
    //在Activity中
    @Override  
    public void onLoginIn (String password)  {
      //得到数据password
    } 


    至此关于使用Fragment创建对话框的介绍就到此结束了。

    请大家多点赞支持一下~


  • 相关阅读:
    Cheatsheet: 2010 05.25 ~ 05.31
    Cheatsheet: 2010 07.01 ~ 07.08
    Cheatsheet: 2010 07.22 ~ 07.31
    Cheatsheet: 2010 06.01 ~ 06.07
    Cheatsheet: 2010 05.11 ~ 05.17
    Cheatsheet: 2010 06.08 ~ 06.15
    Cheatsheet: 2010 06.16 ~ 06.22
    Cheatsheet: 2010 06.23 ~ 06.30
    2020.7.20第十五天
    2020.7.19第十四天
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461460.html
Copyright © 2011-2022 走看看