作者:超级神棍小虾米 | 来源:互联网 | 2023-10-13 11:14
本文翻译自AndroidDeveloperBlog上面的一篇文章,原文地址:http:android-developers.blogspot.hk201205using-dialo
本文翻译自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
fragment_edit_name.xml
注意上面两个属性android:inputType=”text” 和 android:imeOptiOns=”actionDone”, 这两个属性会使得键盘“换行”键(Enter)显示为”完成”(Done)。
Dialog 代码
这个Dialog继承自DialogFragment, 并且我们想向后兼容,所以我们还引入了v4 support library。
EditNameDialog.java
这是个Fragment, 并且实现了onCreateView去加载实际使用的布局文件。
打开对话框(Dialog)
现在我们需要在我们的Activity里面添加一些代码,来打开对话框。这里有个简单的示例:快速打开EditNameDialog来输入用户名,输入完成时,弹出Toast来展示输入的内容。
FragmentDialogDemo.java
有几点需要注意:首先,因为我们在使用v4支持库,所以我们调用了getSupportFragmentManager()而不是getFragmentManager()。当我们加载了初始布局,通过调用EditNameDialog的show方法打开这个dialog, 这将保证Dialog的状态和Fragment的状态保持一致性。默认情况下,回退按键将销毁Dialog而不需要额外的代码。
使用Dialog
接下来让我们丰富一下EditNameDialog,让它返回结果给Activity。
EditNameDialog.java
为了方便,我们通过编程让mEditText获取焦点(mEditText.requestFocus())。另外,我们还可以通过在xml文件中设置 标签来实现。然而,很多情况下适合在代码中实现。举个例子,如果在xml中设置 标签, onCreateView()中的OnFocusChangeListener(如果有的话) 将不会被调用。
如果用户让mEditText获取焦点,软键盘将会自动弹出。我们通过代码让mEditText获取焦点,为了强制让软键盘弹出,我们调用了getDialog().getWindow().setSoftInputMode()方法。注意:在DialogFragment中,可以完成Dialog中的很多窗口操作,但是必须调用getDialog().getWindow()而不是getWindow()。
Dialog在手机和平板上的展示效果
当用户点击“完成”按键时,onEditorAction()方法负责回调。之所以被调用,因为我们给mEditText设置了OnEditorActionListener监听器。它将传递数据给Activity。为了传递数据,EditNameDialog声明了一个接口(EditNameDialogListener),由Activity去实现该接口,这使得Dialog可以被多个Activity重用。 要触发onFinishEditDialog()方法,Fragment通过调用getActivity()方法,并将他转换为接口类型。这是在MVC模型中,View和Controller通信的一个通用做法。
以上就是本篇要讲的。源码请见:Google Code.