使用DialogFragment 代替 Dialog

自从google在发布的3.0版本的安卓系统中引入了fragment之后,在google的官方文档中,我们会发现,官方建议我们使用DialogFragment 来代替原来的dialog,这样可以使我们的对话框具有更多的交互性,也更加符合面向对象的特性。

google官方文档原话

Honeycomb introduced Fragments to support reusing portions of UI and logic across multiple activities in an app. In parallel, the showDialog / dismissDialog methods in Activity are being deprecated in favor of DialogFragments.

(Honeycomb(蜂巢)——是安卓3.0系统的代号)

参考链接

官方文档地址:http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

下面,将介绍如何用DialogFragment来代替原始的dialog.

在下面的实例中,我将使用DialogFragment来显示一个简单的编辑对话框,并且使用回调接口来调用activity。

dialog布局

在下面的布局文件中,我们仅包含一个文本提示和一个输入框。

fragment_edit_name.xml.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/edit_name"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:layout_gravity="center" android:orientation="vertical"  >

    <TextView
        android:id="@+id/lbl_your_name" android:text="Your name"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/txt_your_name"
        android:layout_width="match_parent"  android:layout_height="wrap_content"
        android:inputType=”text”
        android:imeOptions="actionDone" />
</LinearLayout>

注意EditText中的imeoOptions属性,如果对于这一属性不了解的同学可以到我以前关于这一属性的介绍http://blog.csdn.net/a253664942/article/details/45585795 中看看。

DialogFragment类

接下来实现我们的DialogFragment。编写一个EditDialog来继承DialogFragment,并且实现OnEditorActionListener接口。EditDialog跟普通的Fragment没什么太大的区别,只不过内部可以直接调用getDialog()方法来获取一个dialog实例而已。

EditDialog

public class EditDialog extends DialogFragment
implements OnEditorActionListener{

    private EditText mEditText;
    //自定义回调接口
 public interface EditNameDialogListener {
     //回调方法  当输入完成后将输入框中的内容返回给activity
        void onFinishEditDialog(String inputText);
    }
    public EditNameDialog() {
     //空构造方法  ,必须要有!
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_edit_name, container);
        mEditText = (EditText) view.findViewById(R.id.txt_your_name);
        getDialog().setTitle("Hello");

        //获取焦点
        mEditText.requestFocus();
        // 自动显示软键盘
        getDialog().getWindow().setSoftInputMode(
                LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        mEditText.setOnEditorActionListener(this);

        return view;
    }

 @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    //判断ImeOptions的属性,即当按下键盘上的完成按钮时的操作
        if (EditorInfo.IME_ACTION_DONE == actionId) {
            // Return input text to activity

            EditNameDialogListener activity = (EditNameDialogListener) getActivity();
           // 调用回调函数 将输入框中的内容传递给activity
           activity.onFinishEditDialog(mEditText.getText().toString());
            //关闭对话框
            this.dismiss();
            return true;
        }
        return false;
    }
}

出于用户的方便考虑,我们在程序中使用 mEditText.requestFocus()来使EditText获取焦点。当然,我们也可以在xml文件中使用标签来做同样的事。但是,有些情况下,在程序中获取焦点会更好。比如:如果在xml文件中使用标签来获取焦点,那么Fragment中的OnFocusChangeListener 事件将不会调用。

为了让EditText获取焦点时软键盘自动出现,我们调用getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE)方法设置软键盘自动出现。

注意,以前在Dialog中完成的许多Window窗口操作都可以在DialogFragment中完成,不过需要用

getDialog().getWindow()来代替getWindow()。

让我们来看看下面的这段代码。

当用户玩下键盘上的”完成“键时,onEditorAction()方法会被调用。在onEditorAction()方法中,我们将EditText中的内容传回给activity.为了实现此功能,我们声明了一个EditNameDialogListener接口,并在其中定义了onFinishEditDialog()方法用于当完成输入时将EditText中的内容传回给activity。

 @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    //判断ImeOptions的属性,即当按下键盘上的完成按钮时的操作
        if (EditorInfo.IME_ACTION_DONE == actionId) {

            EditNameDialogListener activity = (EditNameDialogListener) getActivity();
           // 调用回调函数 将输入框中的内容传递给activity
           activity.onFinishEditDialog(mEditText.getText().toString());
            //关闭对话框
            this.dismiss();
            return true;
        }
        return false;
    }

下面这行代码,我们将EditNameDialogListener 接口与我们的activity进行绑定。在MVC模式中,这是一种常见的方法,使View视图(我们的DialogFragment)和controller(Activity)进行通信。

EditNameDialogListener activity = (EditNameDialogListener) getActivity();

最后注意一点,EditDialog的空构造方法是必须的!!!

Activity的实现

在activity中代码就很简单了。我们让activity继承fragmentActivity并且实现我们自定义的EditNameDialogListener 接口。然后调用showEditDialog()方法显示我们的dialog.

在回调方法onFinishEditDialog中,我们直接输出输入框中返回的值。

public class FragmentDialogDemo extends FragmentActivity implements EditNameDialogListener {

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

    private void showEditDialog() {
        FragmentManager fm = getSupportFragmentManager();
        EditDialog editDialog = new EditDialog();
        editDialog.show(fm, "fragment_edit_name");
    }

    @Override
    public void onFinishEditDialog(String inputText) {
        Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();
    }
}

源码奉上

时间: 2024-08-10 17:03:34

使用DialogFragment 代替 Dialog的相关文章

【安卓笔记】使用DialogFragment托管dialog

普通的AlertDialog在横竖屏切换时会被销毁,如果dialog上面有数据,也将丢失.解决方案是使用DialogFragment. 使用dialogFragment通常需要复写两个方法: onCreateView(LayoutInflater, ViewGroup, Bundle) onCreateDialog(Bundle) 如果你想自定义dialog样式,只需要复写onCreateView,注入一个自定义的view即可,然后通过调用DialogFragment#show()方法即可. 这

Android Dialogs(2)最好用DialogFragment创建Dialog

Creating a Dialog Fragment You can accomplish a wide variety of dialog designs—including custom layouts and those described in theDialogs design guide—by extending DialogFragment and creating a AlertDialog in the onCreateDialog()callback method. For

Android为啥推荐用DialogFragment创建Dialog?

前言:这段时候有点忙,因为在赶项目,说忙也都是在敷衍,时间挤挤还是有的,从开始写博客的那一刻起就应该一直坚持下来,不要三天打鱼两天晒网,上次写过一个Android进阶之(dialog详解一),今天继续上次的内容探究一下,从Android3.0后Android引入的DailogFragment,我们一起从源码的角度去看看为啥谷歌推荐这样创建Dialog. DialogFragment对话框出现的意义 为什么android系统有AlertDialog,PopupWindow对话框,基本满足客户需求,

Android:自定义DialogFragment的内容和按钮

小问题,记录下~ Android4.0以后开始推荐使用DialogFragment代替Dialog.Android的官方文档中给了两个示例: 一个Basic Dialog 示例了如何自定义窗口内容--重写onCreateView方法. 一个Alert Dialog 示例了如何自定义弹窗的正负按钮--重写onCreateDialog方法. 好的,那么问题来了 在实际应用中经常是需要既自定义窗口内容.又需要自定义按钮的. 这时候如果我们按图索骥,把DialogFragment的onCreateVie

Dialog与FragmentDialog源码解析

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/46402845 [导航] - 弹出式对话框各种方案 从仿QQ消息提示框来谈弹出式对话框的实现方式 (Dialog,PopupWind,自定义View,Activity,FragmentDialog) - Dialog源码解析 从源码上看Dialog与DialogFragment 1.概述 前一篇写了

详细解读DialogFragment

详细解读DialogFragment 相信看这篇文章的人都应该知道android中的Dialog了吧,如果对于Dialog还不是很了解可以看我之前的一篇详解文章: Dialog详解:http://www.cnblogs.com/tianzhijiexian/p/3867731.html 随着Fragment这个类的引入,Google官方推荐大家使用DialogFragment来代替传统的Dialog,那么是不是说我们之前学习的Dialog知识都没有用处了呢?非也,新的fragment是来方便大家

【Android UI设计】Dialog对话框详解(一)

所谓Dialog其实就是一个小窗口,用户在对界面进行某些操作的时候,可以通过Dialog来响应,对用户进行反馈,但是我们一般在使用Dialog的时候是不会直接使用Dialog来进行编码创建对话框,而是使用它的子类来进行操作: AlertDialog 一个对话框-–可以显示一个标题,最多三个按钮,一个可选项列表,或自定义布局. Dialog继承关系图 其他子类不在此处介绍,本篇主要介绍AlertDialog和Android官方推荐使用的DialogFragment这两种方式来创建Dialog. D

DialogFragment的使用与底层绘制

请尊重他人劳动成果,请勿随意剽窃,转载请注明,谢谢!转载请注明出处:http://blog.csdn.net/evan_man/article/details/51812678 DialogFrament是一类特定的Fragment,会将视图绘制在Activity视图的上方.一般使用场景就是展示一个警示对话框,确认对话框.使用DialogFragment而不是直接使用Dialog是一种比较推荐的方式.如果直接使用Dialog那么Dialog的生命周期是需要我们自己手动去管理的,而对于Dialog

Dialog与FragmentDialog源代码分析

<世界守则> -UI一片 注形容自己用语言 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/46402845 [导航] - 弹出式对话框各种方案 从仿QQ消息提示框来谈弹出式对话框的实现方式 (Dialog,PopupWind,自己定义View,Activity.FragmentDialog) - Dialog源代码解析 从源代码上看Dialog与DialogFragment 1.概述 前一篇写