Android DialogFragment对话框

写在前面

从事Android开发至今,一提及Android开发中使用的对话框就想起AlertDialog或者PopupWindow,我在上一篇博客中也总结了这两种对话框的使用大全,有兴趣的可靠look look Android 对话框AlertDialog,PopupWindow使用大全。由于最近在总结Android对话框的使用,就无意在网上看到Android3.0之后出现了一个新的对话框—-DialogFragment。

DialogFragment对话框出现的意义

为什么android系统有AlertDialog,PopupWindow对话框,基本满足客户需求,为啥还要跑出一个DialogFragment对话框呢?这就要从DialogFragment的优点说起了:

  1. 有和Fragment基本一致的生命周期,因此便于Activity更好的控制管理DialogFragment。
  2. 随屏幕旋转(横竖屏幕切换)DialogFragment对话框随之自动调整对话框大小。而AlertDialog和PopupWindow随屏幕切换而消失。
  3. DialogFragment的出现解决 横竖屏幕切换Dialog消失的问题。

DialogFragment对话框的使用

基础对话框

技术分享

代码示例:

package com.xjp.dialogfragment;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;


public class MainActivity extends ActionBarActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void buttonClick(View view) {
        showDialog();
    }

    private void showDialog() {

        /**
         * 为了不重复显示dialog,在显示对话框之前移除正在显示的对话框。
         */
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment fragment = getFragmentManager().findFragmentByTag("basicDialog");
        if (null != fragment) {
            ft.remove(fragment);
        }

        /**
         * 0:默认样式
         * 1:无标题样式
         * 2:无边框样式
         * 3:不可输入,不可获得焦点样式
         * 可根据参数不同执行测试这几种样式的对话框。
         */
        BasicDialogFragment dialogFragment = BasicDialogFragment.newInstace(0);
        dialogFragment.show(ft, "basicDialog");
    }
}


//DialogFragment代码:
package com.xjp.dialogfragment;


import android.app.DialogFragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Description:基础对话框
 * User: xjp
 * Date: 2015/5/20
 * Time: 8:44
 */

public class BasicDialogFragment extends DialogFragment {

    public static BasicDialogFragment newInstance(int style) {
        BasicDialogFragment dialogFragment = new BasicDialogFragment();

        Bundle bundle = new Bundle();
        bundle.putInt("style", style);
        dialogFragment.setArguments(bundle);
        return dialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int styleNum = getArguments().getInt("style", 0);
        int style = 0;
        switch (styleNum) {
            case 0:
                style = DialogFragment.STYLE_NORMAL;//默认样式
                break;
            case 1:
                style = DialogFragment.STYLE_NO_TITLE;//无标题样式
                break;
            case 2:
                style = DialogFragment.STYLE_NO_FRAME;//无边框样式
                break;
            case 3:
                style = DialogFragment.STYLE_NO_INPUT;//不可输入,不可获得焦点样式
                break;
        }
        setStyle(style, 0);//设置样式

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

//        getDialog().setTitle("退出微信");//添加标题
//        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题
        View view = inflater.inflate(R.layout.fragent_basic_dialog, container);

        TextView title = (TextView) view.findViewById(R.id.title);
        title.setText("微信退出");
        TextView message = (TextView) view.findViewById(R.id.message);
        message.setText("是否退出微信,退出微信之后不能受到消息。是否退出微信,退出微信之后不能受到消息。" +
                "是否退出微信,退出微信之后不能受到消息。是否退出微信,退出微信之后不能受到消息。" +
                "是否退出微信,退出微信之后不能受到消息。");
        view.findViewById(R.id.no).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        view.findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        return view;
    }
}



//布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="基础对话框"
        android:textColor="#ff0000" />

    <View
        android:layout_marginTop="5dp"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ff009688"></View>

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="这是一个基础对话框测试用例,这是一个基础对话框测试用例,
        这是一个基础对话框测试用例,
        这是一个基础对话框测试用例,
        这是一个基础对话框测试用例," />

</LinearLayout>

总结:

  1. 基础对话框只需重写onCreateView方法即可加载对话框。
  2. 可根据自己需求调用setStyle(int,int)是否修改对话框样式,上面代码中已经实现。值得注意的是:设置setStyle()必须在onCreateView()方法调用之前才有效,因此一般在onCreate()方法中调用onStyle()方法。
  3. 取消和设置标题的方法:setStyle(DialogFragment.STYLE_NO_TITLE,0) 和 getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE),设置标题可以getDialog().setTitle(“退出微信”);

AlertDialog对话框的使用

技术分享

package com.xjp.dialogfragment;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity implements AlertDialogFragment.DialogFragmentClickImpl {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showAlertDialog();
            }
        });
    }


    private void showAlertDialog() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment fragment = getFragmentManager().findFragmentByTag("basicDialog");
        if (null != fragment) {
            ft.remove(fragment);
        }

        AlertDialogFragment dialogFragment = new AlertDialogFragment();
        dialogFragment.show(ft, "basicDialog");
    }

    @Override
    public void doPositiveClick() {
        showToast("确定按钮");
    }

    @Override
    public void doNegativeClick() {
        showToast("取消按钮");
    }

    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

}

//DialogFragment

package com.xjp.dialogfragment;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

/**
 * Description:
 * User: xjp
 * Date: 2015/5/20
 * Time: 11:18
 */

public class AlertDialogFragment extends DialogFragment {


    public interface DialogFragmentClickImpl {
        void doPositiveClick();

        void doNegativeClick();
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.e("TAG", "**onCreateDialog**");
        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.ic_launcher)
                .setTitle("退出微信")
                .setMessage("是否退出微信,是否退出微信,是否退出微信,是否退出微信,")
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                DialogFragmentClickImpl impl = (DialogFragmentClickImpl) getActivity();
                                impl.doPositiveClick();
                            }
                        }
                )
                .setNegativeButton(android.R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                DialogFragmentClickImpl impl = (DialogFragmentClickImpl) getActivity();
                                impl.doNegativeClick();
                            }
                        }
                )
                .create();
    }
}

总结:

1.可以在onCreateView中加载对话框,也可以重写onCreateDialog,当然二者不要同时出现。
2.对话框和Activity之间的通讯可以通过接口的方式实现,如上代码的DialogFragmentClickImpl接口。
3.onCreateView可以加载客户化更高的对话框,onCreateDialog加载系统AlertDialog类型对话框比较合适。
4.DialogFragment只是在Fragment中实现了一个Dialog而已。
5.DialogFragmnet对话框横屏时对话框不会关闭,因为DailogFragment有Fragment属性,会在屏幕发生变化时重新创建DialogFragment。有图为证:
技术分享
技术分享

源码下载

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。