英语原文共 16 页,剩余内容已隐藏,支付完成后下载完整资料
Dialogs的使用
目录
摘要
Android SDK为对话框提供了广泛的支持。 对话框是一个较小的窗口,在当前窗口前弹出以显示紧急消息,提示用户输入一些内容,或显示某种状态,如下载进度。 通常期望用户与对话框交互,然后返回到下面的窗口以继续应用程序。 从技术上讲,Android允许对话框片段嵌入到活动的布局中,我们也将介绍它。
Android中明确支持的信息包括警报、提示、选择列表、单一选择、多项选择、进度、时间和日期。(这个列表可能会根据Android版本的不同而有所不同。)Android还支持定制以满足其他需求。本章的主要目的并不是要涵盖其中的每一个,而是用一个示例应用程序来覆盖Android的底层体系结构。从那里开始,你将可以使用任何安卓系统。
值得注意的是,Android3.0是基于片段添加的。Google的期望是开发人员只会使用片段,甚至在3.0之前的Android版本中也是如此。这可以通过片段兼容性库来完成。基于这一原因,本章重点讨论了这一问题。
1对话框在Android中的应用
Android是异步的,这种异步提供了灵活性。但是,如果您习惯了同步的编程框架(例如Microsoft Windows,或Web页面中的JavaScript),您可能会发现异步有点不太合适。对于同步对话框来说,显示在对话框后的代码行在对话框被取消之前不会运行。这意味着下一行代码可以查询哪个按钮被按下,或者在对话框中键入了什么文本。然而在Android中,对话框是异步的。对话框一旦被显示,下一行代码就会被运行,即使用户还没有触及该对话框。您的应用程序必须通过从对话框中实现来处理这一事实,以允许应用程序得到用户与对话框交互的通知。这也意味着您的应用程序能够将对话框从代码中剔除,这一点是非常强大的。如果对话框由于应用程序正在执行某项任务而显示一条繁忙的消息,则一旦应用程序完成了该任务,它就可以从代码中删除该对话框。
2理解对话片段
在本节中,您将了解如何使用对话框片段显示一个简单的警报对话框和一个用于收集提示文本的自定义对话框。
2.1对话框架基础
在本节中,您将了解如何使用对话框片段显示一个简单的警报对话框和一个用于收集提示文本的自定义对话框。
public class MyDialogFragment extends DialogFragment { ... }
然后,您可以使用片段事务显示这个对话框片段。清单3-1显示了执行此操作的代码。
清单3-1.显示一个同源片段
public class SomeActivity extends Activity
{
//....其他活动功能
public void showDialog()
{
//构建对话片段
MyDialogFragment mdf = MyDialogFragment.newInstance(arg1,arg2);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
mdf.show(ft,'my-dialog-tag');
}
//....其他活动功能
}
注:在“参考”部分中,我们在本章末尾提供了一个指向另一个项目的链接。您可以使用此下载来实验本章中介绍的代码和概念。
在清单3-1中,显示对话框片段的步骤如下:
1.创建一个对话框片段。
2.找个碎片交易。
3.使用步骤2中的片段事务显示对话框。
让我们来谈谈这些步骤中的每一步。
2.1.1 构造Dialog片段
在构建对话框片段时,与构建任何其他类型的片段时的规则是相同的。建议的模式是像以前一样使用工厂方法,如newInstance()。在该方法中,对话框片段使用默认构造函数,然后添加包含传入参数的参数包。您不希望在此方法中执行其他工作,因为您必须确保在这里所做的工作与Android在将您的对话框片段从保存状态中进行转换时所做的相同。Android所做的就是调用默认的构造函数并在其上重新创建参数包.
2.1.2 覆盖onCreateView
当你从对话框片段继承时,需要重写两种方法中的一种,以便为对话框提供视图层次结构。第一个选项是覆盖onCreateView() 并返回一个视图。第二种选择是重写onCreateDialog()并返回一个对话框(类似于由AlertDialog.Builder构造的对话框,我们将介绍该对话框)。清单3-2给出了一个覆盖onCreateView()的示例。
清单3-2.重写onCreateView()
public class MyDialogFragment extends DialogFragment
implements View.OnClickListener
{
//.....其他功能
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
//按所需布局创建视图
View v=inflater.inflate(R.layout.prompt_dialog, container, false);
//您可以定位视图并设置值。
TextView tv = (TextView)v.findViewById(R.id.promptmessage);
tv.setText(this.getPrompt());
//你可以在按钮上设置
Button dismissBtn = (Button)v.findViewById(R.id.btn_dismiss);
dismissBtn.setOnClickListener(this);
Button saveBtn = (Button)v.findViewById(R.id.btn_save);
saveBtn.setOnClickListener(this);
return v;
}
//.....其他功能
}
在清单3-2中,正在加载一个由布局标识的视图。然后寻找两个按钮,并设置它们。这与在第1章中如何创建细节片段非常相似。但是,与前面的片段不同,对话框片段有另一种方法来创建视图层次结构。
2.1.3 覆盖onCreateDialog
作为在onCreateView ()中提供视图的替代方法,可以覆盖onCreateDialog ()并提供一个对话框实例。清单3-3提供了这种方法的示例代码。
清单3-3.重写onCreateDialog()
public class MyDialogFragment extends DialogFragment
implements DialogInterface.OnClickListener
{
.....其他功能
@Override
public Dialog onCreateDialog(Bundle icicle)
{
AlertDialog.Builder b = new AlertDialog.Builder(getActivity())
.setTitle('My Dialog Title')
.setPositiveButton('Ok', this)
.setNegativeButton('Cancel', this)
.setMessage(this.getMessage());
return b.create();
}
.....其他功能
}
在本例中,使用警报对话框生成器创建要返回的对话框对象。这对于简单对话框来说是很好的。第一种选择,即重写onCreateView(),是同样容易的,并且提供了更多的灵活性。
AlertDialog.Builder实际上是以前的安卓版本。这是创建对话框的旧方法之一,您仍然可以在其中创建新的对话框。正如您所看到的,通过调用各种可用的方法来构建对话框是相当容易的。
2.1.4 显示对话框片段
一旦构建了一个对话框片段,就需要一个片段事务来显示它。与所有其他片段一样,对话框片段的操作是通过碎片交易进行的
对话框片段上的Show()方法将碎片交易作为输入。您可以在清单3-1中看到这一点。该Show()方法使用碎片交易将此对话框添加到活动中,然后提交碎片交易。但是,Show()方法不会将事务添加到后台堆栈。如果要这样做,需要先将此事务添加到后台堆栈,然后将其传递给Show()方法。对话框片段的Show()方法具有以下签名:
public int show(FragmentTransaction transaction, String tag)
public int show(FragmentManager manager, String tag)
第一个Show()方法通过将此片段添加到带有指定标记的传入事务中来显示对话框。然后,此方法返回已提交事务的标识符。
第二个Show()方法从事务管理器获取事务。这是一种快捷的方法。但是,当您使用第二种方法时,您没有将事务添加到后台堆栈的选项。如果您想要该控件,则需要使用第一种方法。如果您想简单地显示对话框,并且当时没有其他理由处理片段事务,则可以使用第二个方法。
对话框作为片段的一个好处是,底层的片段管理器执行基本的状态管理。例如,即使当一个对话框被显示时,该设备也会重新显示该对话框,而不需要您执行任何状态管理。该对话框片段还提供了控制显示对话框视图的框架的方法,例如框架的标题和外观。参考对话帧类文档,以查看更多这些选项;本章末尾提供了这个URL。
2.1.5删除对话框片段
有两种方法可以删除对话框片段。第一种方法是显式调用dismiss ()方法,以响应按钮或对话框视图上的某些操作,如清单3-4所示。
清单3-4. dismiss()
if (someview.getId() == R.id.btn_dismiss)
{
//使用一些提醒客户的方法
//这个对话正在被驳回
//释放
dismiss();
return;
}
对话框片段的dismiss ()方法从片段管理器中移除该片段,然后提交该事务。如果该对话框片段有一个后台堆栈,那么dismiss ()将弹出事务堆栈中的当前对话框,并显示前一个片段事务状态。无论是否有后台堆栈,调用dismiss ()都会导致调用标准的对话框片段破坏,包括onDismiss ()。
有一点要注意的是,您不能依赖onDismiss ()来得出代码已经调用了dismiss ()的结论。这是因为当设备配置发生变化时,也会调用onDismiss (),因此不能很好地指示用户对话框本身做了什么。如果该对话框是在用户对设备进行分级时显示的,则即使用户没有按对话框中的按钮,该对话框片段也会看到onDismiss ()被调用。相反,您应该始终依赖于对话框视图的显式按钮单击。
如果用户在显示对话框片段时按下Back按钮,这将导致onCancel ()对该对话框片段触发。默认情况下,Android会使对话框片段消失,因此您不需要自己对该片段调用dismiss ()。但是,如果希望通知调用活动该对话框已被取消,则需要从onCancel ()调用逻辑以实现这一点。这是带对话框片段的onCancel ()和onDismiss ()之间的区别。有了onDismiss (),你就不能确定到底发生了什么事情,导致了新的onDismiss ()。您可能还注意到,一个对话框片段没有cancel ()方法,只需dismiss ();但是正如我们所说的,当一个对话框片段通过按Back按钮被取消时,Android会帮您处理/它。
全文共12764字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[735]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。