基于android的旅游日记手机应用设计与开发外文翻译资料

 2022-12-05 16:58:43

外文原文

Fragments Fundamentals

What Is a Fragment?

This first section will explain what a fragment is and what it does. But first,letrsquo;s set the stage to see why we need fragments. As you learned earlier, an Android application on small-screen devices uses activities to show data and functionality to a user, and each activity has a fairly simple, well-defined purpose. For example, an activity might show the user a list of contacts from their address book. Another activity might allow the user to type an e-mail. The Android application is the series of these activities grouped together to achieve a larger purpose, such as managing an e-mail account via the reading and sending of messages. This is fine for a small-screen device, but when the userrsquo;s screen is very large (10” or larger), therersquo;s room on the screen to do more than just one simple thing. An application might want to let the user view the list of e-mails in their inbox and at the same time show the currently selected e-mail text next to the list. Or an application might want to show a list of contacts and at the same time show the currently selected contact in a detail view.

As an Android developer, you know that this functionality could be accomplished by defining yet another layout for the xlarge screen with ListViews and layouts and all sorts of other views. And by “yet another layout” we mean layouts in addition to those yoursquo;ve probably already definedfor the smaller screens. Of course, yoursquo;ll want to have separate layouts for the portrait case as well as the landscape case. And with the size of an xlarge screen, this could mean quite a few views for all the labels and fields and images and so on that yoursquo;ll need to lay out and then provide code for. If only there were a way to group these view objects together and consolidate the logic for them, so that chunks of an application could be reused across screen sizes and devices, minimizing how much work a developer has to do to maintain their application. And that is why we have fragments.

One way to think of a fragment is as a sub-activity. And in fact, the semantics of a fragment are a lot like an activity. A fragment can have a view hierarchy associated with it, and it has a life cycle much like an activityrsquo;s life cycle. Fragments can even respond to the Back button like activities do. If you were thinking, “If only I could put multiple activities together on a tabletrsquo;s screen at the same time,” then yoursquo;re on the right track. But because it would be too messy to have more than one activity of an application active at the same time on a tablet screen, fragments were created to implement basically that thought. This means fragments are contained within an activity. Fragments can only exist within the context of an activity; you canrsquo;t use a fragment without an activity. Fragments can coexist with other elements of an activity, which means you do not need to convert the entire user interface of your activity to use fragments. You can create an activityrsquo;s layout as before and only use a fragment for one piece of the user interface.

Fragments are not like activities, however, when it comes to saving state and restoring it later. The fragments framework provides several features to make saving and restoring fragments much simpler than the work you need to do on activities.

How you decide when to use a fragment depends on a few considerations, which are discussed next.

When to Use Fragments

One of the primary reasons to use a fragment is so you can reuse a chunk of user interface and functionality across devices and screen sizes. This is especially true with tablets. Think of how much can happen when the screen is as large as a tabletrsquo;s. Itrsquo;s more like a desktop than a phone, and many of your desktop applications have a multipane user interface. As described earlier, you can have a list and a detail view of the selected item on screen at the same time. This is easy to picture in a landscape orientation with the list on the left and the details on the right. But what if the user rotates the device to portrait mode so that now the screen is taller than it is wide? Perhaps you now want the list to be in the top portion of the screen and the details in the bottom portion. But what if this application is running on a small screen and therersquo;s just no room for the two portions to be on the screen at the same time? Wouldnrsquo;t you want the separate activities for the list and for the details to be able to share the logic yoursquo;ve built into these portions for a large screen? We hope you answered yes. Fragments can help with that.

Figure 1-1 makes this a little clearer.

Figure 1-1. Fragments used for a tablet UI and for a smartphone UI

In landscape mode, two fragments may sit nicely side by side. In portrait mode, we might be able to put one fragment above the other. But if wersquo;re trying to run the same application on a device with a smaller screen, we might need to show either fragment 1 or fragment 2 but not both at the same time. If we tried to manage all these scenarios with layouts, wersquo;d be creating quite a few, which means difficulty trying to keep everything correct across many separate layouts. When using fragments, our layouts stay simple; each activity layout deals with the fragments as containers, and the activity layouts donrsquo;t need to specify the internal structure of each fragment. Each fragment

剩余内容已隐藏,支付完成后下载完整资料


外文翻译

学生姓名

董伟

学号

20121308111

学院名称

计算机与软件学院

专业名称

计算机科学与技术

片段原理

什么是片段?

这一小节将解释什么是片段以及片段的意义所在。首先,让我们假设一个场景看看为什么我们需要用到片段。正如你之前所学到的,在小屏幕设备上,一个Android应用程序使用活动(activity)给用户展示数据和功能,而且每个活动都有一个相当简单,定义明确的目的。例如,一个活动可能在地址簿里展示联系人列表给用户看。另一项活动可能会允许用户输入一个电子邮件。Android的应用程序是一系列活动组合在一起以实现更大的目的,例如通过消息的阅读和发送管理电子邮件账户。对于一款小屏幕设备来说这是很好的,但是当用户的屏幕非常大的时候(10寸或更大),在屏幕上就有更大空间能够不仅仅只做一些简单的事情了。应用程序就可以让用户在他们的收件箱里看到邮件的列表,同时在邮件列表旁查看当前选定的电子邮件文本。或者应用程序显示联系人列表的同时显示当前选中联系人的详细信息。

作为Android开发者,你应该知道这个功能可以通过为XLARGE屏幕定义另外一套有着ListView、不同的layout或者其他布局来实现。这里的“另外一套布局”是指除了那些你可能已经为小屏幕定义的布局。当然,你可能希望在有画像和风景的情况下有单独的布局。同时在XLARGE屏幕上,这可能意味着对所有的标签、字段和图像等有相当多的视图以致于你需要布局并为之编码。假如有办法将这些视图对象组合在一起,对他们进行统一逻辑,这样就可以在不同的屏幕尺寸的设备上重用应用程序的代码,减少开发人员维护自己的应用程序的工作。这就是为什么我们需要用到片段。

考虑片段的一种方法就是作为一个子活动。事实上,一个片段的语义很像一个活动。片段可以有视图层次与之相关联,并且它具有和活动生命周期类似的生命周期。片段甚至可以像活动一样对后退按钮做出响应。如果你在想,“我是否可以把多种活动同时放在平板电脑屏幕上“,那么你的思路是对的。但是,因为同时在一个平板屏幕上激活多个活动显得很乱,所以片段的创建基本实现这个想法。这意味着片段可以包含在一个活动中。片段只能在活动的上下文中存在;你不能在活动之外使用一个碎片。片段可以和活动的其他元素共存,这意味着你不需要使用片段包含活动的整个用户界面。您可以先创建一个活动的布局,然后只用一个片段作为用户界面的一部分。

但是在保存状态信息和恢复状态信息上,片段不像活动。片段框架提供了一些功能,这样在保存和恢复片段时比在活动里做这些操作更简单。

当你决定使用一个片段时要取决于哪几个因素呢,这是接下来讨论。

何时使用片段

使用片段的一个主要原因是你就可以跨设备和屏幕尺寸复用用户界面和功能块。对于平板电脑尤其如此。考虑一下当屏幕和平板大小一样时会发生什么。它更像是一个桌面而不是一部电话,而你的许多桌面应用程序有一个多屏的用户界面。就像之前提到的,你可以在屏幕上同时看到一个列表以及算中条目的详细视图。这在横屏模式中很容易实现列表在左边,详情在右边。但是,如果用户旋转设备到竖屏模式导致屏幕高度大于宽怎么办? 也许你现在会想让列表在屏幕的顶部部分,让详情在底部。 但是,如果这个应用程序在一个小屏幕上运行,而且同时在屏幕上也没有为两部分留有空间怎么办? 难道你不想要让不同的活动分别展示列表和详情,这样你可以在大的屏幕上展示你在这些部分建立的逻辑? 我们希望你的回答是肯定。 片段可以实现这样的效果。

图1-1. 可以清楚的解释这些。

图1-1. 在平板和只能手机上展示片段

在横屏模式下,两个片段可以并排放置。在竖屏模式下,我们可以把一个片段放在另一个上面。但是,如果我们尝试在小屏幕上运行同一个应用程序,我们可能需要为显示片段1或2的片段但不能同时显示。如果我们试图用布局管理所有场景,我们可能简历相当多的布局,这意味着很难让所有东西在各种不同的布局上是正确的。当使用片段时,我们的布局就简单了;每个活动布局以容器的方式处理片段,同时活动布局不需要指定每个片段的内部结构。每个片段将可以为它的内部结构指定自己的布局,而且可以复用很多配置。

让我们回到旋转方向的例子。如果你已经为一个活动方向改变而编码了,你就知道,保存活动的当前状态,并在活动被重建时恢复状态是一件很痛苦的事情。如果你的活动在改变方向时可以很容易保留块,那样你可以在每次改变方向时避免所有的销毁以及重建岂不是很完美?这当然可以做到。片段就可以实现这些。

现在想象一下,一个用户在使用你的活动,而且他们已经做了一些工作。然后想象在同一个活动中用户界面发生了变化,然后用户想返回的之前一步,或者两步或者三步。在原来的活动中,按返回键可以让用户退出整个活动。。有了片段,返回键可以回退片段的栈而停留在当前的活动中。

接下来,想象一个活动的用户界面里一个大的内容区域发生变化;你想使过渡像一个完美的应用程序看起来平滑。片段也可以做到这一点。

现在应该对什么是片段,为什么要使用片段有了一些认识,下面我们深入了解片段的结构。

一个片段的生命周期

在你开始在一个简单的应用程序里使用片段之前,你需要了解一个片段的生命周期。为什么?片段的生命周期比一个活动的生命周期更复杂,而且理解什么时候可以利用片段做一些事情也很重要。图1-2展示了片段的生命周期。

图1-2. 片段的生命周期

如果你和一个活动的生命周期进行对比,你会发现几处不同,主要是因为一个活动和一个片段之间所需的相互作用。片段是非常依赖于活动的,当片段的活动完成一个生命周期时,片段才能存在并经过多个步骤完成一个生命周期。

在一开始,片段被实例化。现在以对象的形式存在内存中。之后所做的事就是在你的片段对象里添加初始化的参数。在实际情况中,系统从保存的状态重新创建你的片段。当系统从已保存状态中恢复片段时,默认的构造函数被调用,接着初始化附带的参数bundle。如果你正在写创建片段的代码,可以使用清单1-1这样漂亮的模式,清单展示了用工厂模式实例化定义一个MyFragment类。

清单1-1. 使用静态工厂模式实例化一个片段

public static MyFragment newInstance(int index) {

MyFragment f = new MyFragment();

Bundle args = new Bundle();

args.putInt('index', index);

f.setArguments(args);

return f;

}

但从客户端的角度来看,通过调用一个参数的静态newInstance()方法得到一个新的实例。他们得到的实例化的对象,之后初始化的参数被设置在这个fragment里的参数bundle上。如果该片段被保存并重建以后,系统将通过调用一个非常相似的默认构造方法的过程,并且重新附加初始化参数。为了特定情况下,你可能会定义你的一个newInstance()方法(或多个方法)的签名来取合适数量和类型的参数,然后生成适当的参数bundle。这就是你希望你的newInstance()方法能够做的事。下面的回调方法将解释启动你的片段的其他部分。

onInflate()回调

接下来的事情就是加载布局视图。如果你的片段是通过布局中的lt;fragmentgt;标签定义的,片段的onInflate()回调将会被调用。将lt;fragmentgt;标签的属性AttributeSet,以及保存的bundle传递到被包含的活动里。保存的bundle包含保存的状态值,这个状态值在片段退出前通过onSaveInstanceState()存储,在重建时恢复。onInflate()的作用是读取属性值并将其保存以供以后使用。在片段生命周期的这个阶段中,事实上还太早去做一些用户界面的事情。片段甚至还没有和活动关联。但这个关联操作将在下个阶段作用在你的片段上。

onAttach()回调

片段与其活动相关联后就会回调onAttach()。如果你想使用活动,活动的引用可以传递给你。你至少可以利用活动来确定你的封闭活动的信息。您还可以使用活动作为上下文进行其他操作。有一点要注意的是,片段类有一个getActivity()方法,当你需要的时候这个方法始终返回片段所附加的活动。请记住,在这个生命周期中,可以通过片段的getArgument()方法获得初始化参数。但是,一旦片段连接到它的活动,你不能再调用setArguments()。因此,除了开始的时候,你不能添加初始化参数。

onCreate()回调

接下来是的onCreate()回调。虽然这和活动的onCreate()类似,不同的是,你不应该把依赖于活动视图层次存在的代码放在这里。你的片段可以关联它的活动,但你还没有被通知该活动的onCreate()已经完成。下面就是要做这个操作。如果有保存状态bundle传递,将在此处回调获得。这个回调方法用于尽早创建一个后台线程来获取片段需要的数据。您的片段代码在UI线程上运行,而你不想在UI线程里做的磁盘输入/输出(I/O)或网络访问。事实上,它的一个很大的意义在于启动后台线程得到贮备好的东西。你的后台线程应该是阻塞调用。你可能使用的handler或者其他技术来挂钩后来的数据。

onCreateView()回调

接下来的回调是onCreateView()。你希望在这里为片段返回一个视图层次结构。传递给此回调的参数包括LayoutInflater(你可以用它来加载这个片段的布局),一个ViewGroup(在清单1-2被称为容器),如果有bundle的话,还需要要带上bundle。需要注意的是,你不应该将视图层次附加到传递进来的父容器ViewGroup。这个操作在后面会自动执行。如果你在这个回调方法里将片段的视图层次附加到父容器里将发生异常,至少会导致应用程序奇怪和未知的运行。

清单1-2. 在CreateView()中创建片段视图层次

@Override

public View onCreateView(LayoutInflater inflater,

ViewGroup container, Bundle savedInstanceState) {

if(container == null)

return null;

View v = inflater.inflate(R.layout.details, container, false);

TextView text1 = (TextView) v.findViewById(R.id.text1);

text1.setText(myDataSet[ getPosition() ] );

return v;

}

由于提供了父容器,你可以通过LayoutInflater的inflate()方法来使用它。如果父容器值为空,这意味着这个特殊的片段将无法查看,因为它的视图层次结构无处可以依附。在这种情况下,你可以简单地返回空。请记住,这有可能导致在你的应用程序里有片段存在但是没有被显示出来。清单1-2展示了你可能想在这个方法中做的操作。

这里将告诉你如何可以访问到XML布局文件,这个文件将回调给调用者然后加载到片段里。这个方法有几个有点。你可以在代码里构建视图层次结构,然后你可以利用系统的查找资源的逻辑加载XML布局文件。你可以根据设备属于哪个配置,或者无论你是什么设备来选择相应的XML布局文件。然后,您可以在访问特定视图的布局,在这种情况下,你可以对TextView text1做你想做的事。要重复的很重要的一点是:在这个回调里不要把片段的视图添加到父容器里。您可以参考清单1-2里使用容器调用inflate(),但你也需要传递false给attachToRoot参数。

onViewCreated()回调

这个回调方法在onCreateView()之后、在任何保存的状态被添加到UI之前被调用。被传递的对象和onCreateView()返回的对象是一样的。

onActivityCreated()回调

这里快要接近用户和你的片段交互的地方了。接下来就是回调onActivityCreated()。活动已经完成了它的onCreate()回调后

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[28817],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。