DialogFragment的基本使用

本文翻译自Android Developer Blog上面的一篇文章,原文地址:http://android-developers.blogspot.hk/2012/05/using-dialogfragments.html


Android 3.0 开始引入了Fragment来支持部分UI和逻辑在多个Activity中重用。与此同时,鉴于DialogFragment的优势,Activity中的showDialog/dismissDialog等方法被标记为过时(deprecated)。

在本篇中,我将给大家展示,如何在v4支持库(兼容3.0之前的版本)的支持下,来使用DialogFragment展示一个简单的编辑对话框(dialog)并通过回调的方式(interface)返回数据给调用它的Activity。关于Dialogs的设计规范,请参阅Android Design站点。

布局


下面是dialog的布局,命名为fragment_edit_name.xml

DialogFragment的基本使用_第1张图片
fragment_edit_name.xml

注意上面两个属性android:inputType=”text” 和 android:imeOptions=”actionDone”, 这两个属性会使得键盘“换行”键(Enter)显示为"完成"(Done)。

Dialog 代码


这个Dialog继承自DialogFragment, 并且我们想向后兼容,所以我们还引入了v4 support library。

DialogFragment的基本使用_第2张图片
EditNameDialog.java

这是个Fragment, 并且实现了onCreateView去加载实际使用的布局文件。

打开对话框(Dialog)


现在我们需要在我们的Activity里面添加一些代码,来打开对话框。这里有个简单的示例:快速打开EditNameDialog来输入用户名,输入完成时,弹出Toast来展示输入的内容。

DialogFragment的基本使用_第3张图片
FragmentDialogDemo.java

有几点需要注意:首先,因为我们在使用v4支持库,所以我们调用了getSupportFragmentManager()而不是getFragmentManager()。当我们加载了初始布局,通过调用EditNameDialog的show方法打开这个dialog, 这将保证Dialog的状态和Fragment的状态保持一致性。默认情况下,回退按键将销毁Dialog而不需要额外的代码。

使用Dialog


接下来让我们丰富一下EditNameDialog,让它返回结果给Activity。

DialogFragment的基本使用_第4张图片
EditNameDialog.java

为了方便,我们通过编程让mEditText获取焦点(mEditText.requestFocus())。另外,我们还可以通过在xml文件中设置 标签来实现。然而,很多情况下适合在代码中实现。举个例子,如果在xml中设置 标签, onCreateView()中的OnFocusChangeListener(如果有的话) 将不会被调用。

如果用户让mEditText获取焦点,软键盘将会自动弹出。我们通过代码让mEditText获取焦点,为了强制让软键盘弹出,我们调用了getDialog().getWindow().setSoftInputMode()方法。注意:在DialogFragment中,可以完成Dialog中的很多窗口操作,但是必须调用getDialog().getWindow()而不是getWindow()。


DialogFragment的基本使用_第5张图片
Dialog在手机和平板上的展示效果


当用户点击“完成”按键时,onEditorAction()方法负责回调。之所以被调用,因为我们给mEditText设置了OnEditorActionListener监听器。它将传递数据给Activity。为了传递数据,EditNameDialog声明了一个接口(EditNameDialogListener),由Activity去实现该接口,这使得Dialog可以被多个Activity重用。 要触发onFinishEditDialog()方法,Fragment通过调用getActivity()方法,并将他转换为接口类型。这是在MVC模型中,View和Controller通信的一个通用做法。

以上就是本篇要讲的。源码请见:Google Code.

你可能感兴趣的:(DialogFragment的基本使用)