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。有图为证:

源码下载

时间: 2024-11-13 08:55:03

Android DialogFragment对话框的相关文章

[Android]关于对话框dialog的一些事

7种形式的Android Dialog使用举例 http://www.oschina.net/question/54100_32486 [Android]关于对话框dialog的一些事,布布扣,bubuko.com

(七)android 通知对话框,并且监听了返回键,当按下返回键也会创建一个对话框

一.activity_main.java中代码   1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="matc

android的对话框

android中的对话框形式有四种,分别是一般对话框形式,列表对话框形式,单选按钮对话框,多选按钮对话框,下面我一一对他们进行详解. <一>一般对话框 一般对话框形式如下图: 具体实现代码如下: 1 new AlertDialog.Builder(this) 2 .setTitle("删除")//设置标题 3 .setMessage("确定要删除指定的记录?")//设置提示消息 4 .setPositiveButton("确定",ne

android 时间对话框 TimePickerDialog详细介绍

 个人在做提醒功能的时候用到了TimePickerDialog对话框,查阅了很多技术资料,但是感觉很多东西都说的不是很详细,并且很多地方,都有不完善的地方,比如有弹出对话框得到的不是系统当前的时间,而是一个其他时间的现象,让人很是苦闷.所以在经过几度研究之后,决定把个人对此空间的部分理解拿出来与大家讨论,如有不对之处,敬请谅解,会加以改进. 闲话不多说,直接进入主题: 首先,我们要在程序中声明一个日历的对象,并对其实例化获取日历实例,后面会用到. private Calendar c = C

Android日期对话框NumberPicker的用法教程

NumberPicker是Android3.0之后引入的一个控件,NumberPicker 是用于选择一组预定义好数字的控件.比如时间hour的选择只有0-23有效,则可以通过setMinValue和setMaxValue设定. 使用该控件时需注意他的两个listener和一个formatter:一个listener用于监听当前value的变化:一个listener用于监听该控件的scroll状态:formatter用于格式化显示该控件中的value.下面逐一介绍这几个接口: 1.NumberP

Android开发 DialogFragment对话框详解

前言 在聊DialogFragment之前,我们看看以往我们在Android里实现一个对话框一般有这几种方式: Dialog 继承重写Dialog实现一个自定义的Dialog AlertDialog Android原生提供的对话框(底层是继承Dialog实现) PopupWindow 用弹出悬浮框,实现对话框.这种对话框可以用在指定位置显示,一般用于一些非常小的按键弹窗.怎么实现可以参考我的博客:https://www.cnblogs.com/guanxinjing/p/10156153.htm

Android的对话框DialogFragment指定弹窗口大小,设置圆角

@Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//1.必须设置dialog的window背景为透明颜

android各种对话框总结笔记

确定取消对话框(带图标) //(上下文,主题) new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT) .setTitle("标题").setMessage("内容").setIcon(R.drawable.ic_launcher) //响应点击事件 .setPositiveButton("确定", new OnClickListener() { @Overrid

Android通用对话框组件设计

DialogFragment实现自定义的通用对话框,效果图如下面显示的: 一二两张图是DialogFragment实现,第三张图为一个自定义的Toast.一二张图满足基本需求,稍微修改可以用到自己的项目中去,一二中可以根据代码传递View,实现内容区不仅仅显示文字,也可修改后显示你想现实的任何View组件[自己实现即可,这里不给源码].                      源代码下载地址:http://download.csdn.net/detail/itjavawfc/9009887 版