Andr“.NET研究”oid用户界面设计:使用片段

  Android 3.0引入的新的片断(Fragment)API,让我们更容易地创建动态用户界面。在这个教程中,我们学习如何将一个两屏的ListView转换成WebView流,以适应大屏幕的单屏流设计,比如在平板设备中。

  这篇文章的节奏将比我们的入门教程更快一些。如果你对基本的Android控件或概念不熟悉你可能需要复习这个网站上我们其它的一些教程,甚至是Android API参考。最终的开源代码可以在Google code上下载到。

  片段简介

  在我们开始之间,让我们在更高的层次上定义一下什么是片段。通常来说,片段是一大块用户界面,它具有自己的生存周期。如果它听起来像一个Activity,那是因为它确实很像一个Activity。然而,片段与Activity不同,片段必须存在于Activity之内。片段不须要在它每次初始化的时候与同一个Activity配对,这使它具有一些灵活性。与Activity一样,片段也无需包含任何用户界面。

  步骤0:开始

  这个教程假设你读过我们的列表视图教程,你可以下载那个教程的代码,并完成一些任务,然后开始,也可以直接下载这个教程的代码直接开始。

  步骤1:重新设计界面

  下图示意了我上在列表视图教程中所提到的文章阅读应用,我们还没有考虑并使用片段:
  这个流程在相对小屏幕上运行得很不错。然而,在大屏幕上,比如Motorola Xoom平板的10寸屏幕上,在列表视图上却浪费了很多空间。WebView看起来正常,但是有点枯燥。

  这就是要引入片段的地方:在大屏幕上,我们可以提供更有效的用户界面,如果我们可以在同一屏上显示ListView和WebView。当用户点击左边“面板”的列表视图中的某一项时,右边的WebView更新显示相应的内容。这种工作流程经常用于email或文档或RSS阅读器。下图就是重新设计之后的界面示意图:

  步骤2:转换为基于片段的设计

  现在我们知道了新的流程应该如何设计,我们也知道当前的两个活动必须转换成片段。我们将分几步来完成这个转换。第一步保持界面样子不变,只是使用片段修改每个界面内容。一个片段将包含当前的ListView,另一个包含WebView。然后我们再转到单个屏幕的实现,修改ListView和WebView之间的消息传递。

  首先,将你的程序的项目构建目标改变Android 3.0。在Eclipse中,右键点击项目并选择“属性”。点击Android部分并选中Android 3.0。我们不使用任何Google API,所以Android开源项目版本足够了。然后点击“确定”按钮。

现在你就可以访问新的API了,包括片段API。

  注意:在将来的教程中,我们将讨论如何使用新的兼容层来使得像片段API这样的技术在更早版本的Android设备上也能工作。但是现在它只能运行在Android 3.0设备上。

  步骤3:创建片段类

  创建两个Java类来代表两个片段:ListView界面和WebView界面。将它们命名为TutListFragment和TutViewerFragment。TutListFrag上海网站建设ment将继承ListFragment类,TutViewerFragment只是继承Fragment类。

在TutListFragment类中,我们需要重写两个方法: onListItemClick()和onCreate()。这些方法的内容看起来应该很熟悉,它与之前我们讲过的TutListActivity类的代码一致。这个代码很快就要修改,但是现在暂时不需要,下面是当前TutListFragment类的代码:


@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String[] links = getResources().getStringArray(R.array.tut_links);

String content = links[position];
Intent showContent = new Intent(getActivity().getApplicationContext(),
TutViewerActivity.class);
showContent.setData(Uri.parse(content));
startActivity(showContent);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(ArrayAdapter.createFromResource(getActivity()
.getApplicationContext(), R.array.tut_titles,
R.layout.list_item));
}

  TutViewerFragment类更简单一些。我们基于当前片段运行在同一个活动下并且直接从Fragment类内问部获取目标数据的事实。添加一个重写onCreateView()方法。这个方法的代码应该看起来像这样:


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Intent launchingIntent = getActivity().getIntent();
String content = launchingIntent.getData().toString();

WebView viewer = (WebView) inflater.inflate(R.layout.tut_view, container, false);
viewer.loadUrl(content);

return viewer;
}

  直接访问活动实例的能力非常有用,但是在后面会引起一个问题。如果这个片段存在于带有列表片段的界面上会怎么样呢?在那样的情况下,就会没有启动目标来获取URL。类似的在TutListFragment中,只要当用户点击一个列表项时我们都直接启动一个新的Activity。如果TutViewFragment在同一个活动中存在什么怎么样呢?如果这样的话,启动一个新的活动就没有意义了。我们将在这个教程的后面回过头来解决这个问题。

  步骤4:添加片段布局资源

  现在创建一个新的名为“tutlist_fragment.xml”的布局文件来表示包含文章列表的片段。片段布局资源使用你创建的Fragment类的标签和引用。


<?xml version="1.0" encoding="utf-8"?>
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.mamlambo.tutorial.tutlist.TutListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tutlist_fragment">
</fragment>

  接下来,创建一个类似的布局文件,叫做tutview_fragment.xml:


<?xml version="1.0" encoding="utf-8"?>
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.mamlambo.tutorial.tutlist.TutViewerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tutview_fragment">
</fragment>

  步骤5:更新Activity类

  TutListActivity和TutViewerActivity类必须修改。TutListActivity类只有一个方法,onCreate(),现在需要修改它来加载你在前一步创建的合适的片段布局资源,如下:


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.tutlist_fragment);
}

  TutListActivity应该继承Activity类,而不是ListActivity类。

  TutViewerActivity类也需要类似的修改,它的onCreate()方法现在看起来像这样:


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

  步骤6:检查你的进度

  尝试现在运行程序。你会发现它和以前一样。没什么值得兴奋的,不是么?然而,整个用户界面现在使用片段来运行了。这使你需要做的下一步修改更加平滑,我们添加一个新的布局来组合两个片段以在一个界面上显示。然而可能你也注意到了,片段之间的通信的处理和我们文章之间的通信一样。事实上,我们每个片段对应的活动保持不变。当一个活动包含并管理两个片段时,这将不符合需求。首先让我们来修复它。

  步骤7:改变TutListFragment通信

  像你在步骤3中学到的一样,从TutListFragment对象直接启动一个活动不再有效了。WebView UI可能与列表是同一个活动的一部分——总之那就是我们对于大屏幕的计划。在那种情况下,我们只想在第二个片段中更新WebView的URL。

  做这些修改,我们需要做几件事情。首先,我们让片段不依赖于它们所在的活动。要做到这一点,在TutListFragment类中添加一个侦听器,如下:


public interface OnTutSelectedListener {
public void onTutSelected(Uri tutUri);
}

  然后通过更新onListItemClickListener()方法来触发它,如下:


@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String[] links = getResources().getStringArray(R.array.tut_links);

String content = links[position];
tutSelectedListener.onTutSelected(Uri.parse(content));
}

  接下来让TutListActivity类实现OnTutSelectedListener接口,如下:


public class TutListActivity extends Activity implements上海徐汇企业网站制作pan style="color: #000000;">
TutListFragment.OnTutSelectedListener {
...
@Override
public void onTutSelected(Uri tutUri) {
Intent showContent = new Intent(getApplicationContext(),
TutViewerActivity.class);
showContent.setData(tutUri);
startActivity(showContent);
}

  现在我们分离了片段的功能,这些功能用于处理用户界面,作为控制器的活动,向下一个活动传递数据。我们后面要修改onTutSelected()方法来决定是否启动一个新的活动实例或者更新现有的片段实例。

  步骤8:改变TutViewerFragment通信

  现在让我们把注意力转到TutViewerFragment类上,它的代码也需要修改。片段不再查询启动目标来找出加载哪个URL,而是等待被通知要加载哪个URL。在样,我们可以直接修改WebView而不需要每次加载都重新创建片段。

  首先,修改TutViewerFragment类,让它包含一个叫做updateUrl()的方法:


public void updateUrl(String newUrl) {
if (viewer != null) {
viewer.loadUrl(newUrl);
}
}

  其次,删除所有onCreateView()方法下的功能,除了inflate()的调用。在TutViewerActivity类中,添加这些功能检索Intent然后调用updateUrl()方法,如下:


@Override
public void onCreate(B上海闵行企业网站设计与制作undle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tutview_fragment);

Intent launchingIntent = getIntent();
String content = launchingIntent.getData().toString();

TutViewerFragment viewer = (TutViewerFragment) getFragmentManager()
.findFragmentById(R.id.tutview_fragment);

viewer.updateUrl(content);
}

  此时此刻,程序的行为还是没有变化。然而通过进一步的代码,片段现在可以共存在同一个活动中或者分开。

  步骤9:添加双片段布局

  现在让我们来创建带有两个片段的布局,以供特定情况使用。在layout-land目录(你可能需要自己创建),粘贴一份tutlist_fragment.xml。它将对横屏和竖屏提供不同的布局。竖屏模式将保持不变。编辑这个文件如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
android:name="com.mamlambo.tutorial.tutlist.TutListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/tutlist_fragment"
android:layout_weight="45">
</fragment>
<fragment
android:name="com.mamlambo.tutorial.tutlist.TutViewerFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/tutview_fragment"
android:layout_weight="55">
</fragment>
</LinearLayout>

  这将界面分隔成水平地两个片段(左右结构)。

  步骤10:添加动态选项

  现在我们可以为程序添加一些简单的逻辑,可以在启动一个新上海企业网站设计与制作的活动(双屏模式)和更新存在的片段(单屏模式)之间切换。

  为了达到这个目的,更新TutListActivity类的onTutSelected()方法如下:


@Override
上海闵行企业网站制作>public void onTutSelected(String tutUrl) {
TutViewerFragment viewer = (TutViewerFragment) getFragmentManager()
.findFragmentById(R.id.tutview_fragment);

if (viewer == null || !viewer.isInLayout()) {
Intent showContent = new Intent(getApplicationContext(),
TutViewerActivity.class);
showContent.setData(Uri.parse(tutUrl));
startActivity(showContent);
} else {
viewer.updateUrl(tutUrl);
}
}

  我们所做的就是获取片段并检查它是否是现存的布局的一部分。如果不是,查看器活动启动,否则更新已存在的片段。

  步骤11:运行最新的使用片段的程序

  到此,程序将有两种模式:竖屏保持不变,横屏显示列表位于WebView的左侧。现在可以做几个改进,但是只是做微调,优化。比如,如果你在竖屏WebView模式下并旋转屏幕,结果还是只有WebView界面。你必须点击返回以获得双面视图。程序修正不在这个教程讲述的范围,但是你可以发现,如果使用适当的布局并且加上一些活动逻辑,你可以对于不同的屏幕和设备做到非常强大和灵活。

  总结

  片段API帮助组织用户界面组件,以使它们可以实现跨活动重用。这样,程序可以在相对少的代码量下,动态地适应它的流程和用户界面。你也能看到基于片段构建的代码更容易重新组织。更值得高兴的是,通过Google提供的兼容库,现在任何程序都可以使用片段了,它甚至兼容到Android 1.6。现在就使用片段来为每一个屏幕大小和形状创建你的程序用户界面吧!

时间: 2024-10-14 09:44:37

Andr“.NET研究”oid用户界面设计:使用片段的相关文章

关于做Andr“.NET研究”oid+J2ee系统集成开发的一点心得

前言: 很早以前,就听人说过android以后会火起来,作为一个前瞻性,对它有所了解会是一个转型的好机会.javaweb太成熟饱和了,现在市面上各种android手机层出不穷,网上各种android视频连续剧一样上海企业网站制作跟进,安卓一下子成为了热门话题,刚开始也是出于个人兴趣学的很hi感觉挺容易上手的样子,后来工作中才发现问题很多也很棘手,慢慢的在纠结和痛苦中琢磨出了一些经验和规律! 1. android作为v上海徐汇企业网站制作iew层,要实现和服务层低耦合,必须使用webservice

Android用户界面设计:使用片段

Android 3.0引入的新的片断(Fragment)API,让我们更容易地创建动态用户界面.在这个教程中,我们学习如何将一个两屏的ListView转换成WebView流,以适应大屏幕的单屏流设计,比如在平板设备中. 这篇文章的节奏将比我们的入门教程更快一些.如果你对基本的Android控件或概念不熟悉你可能需要复习这个网站上我们其它的一些教程,甚至是Android API参考.最终的开源代码可以在Google code上下载到. 片段简介 在我们开始之间,让我们在更高的层次上定义一下什么是片

什么是用户界面设计

在人和机器的互动过程(Human Machine Interaction)中,有一个层面,即我们所说的界面(interface).从心理学意义来分,界面可分为感觉(视觉.触觉.听觉等)和情感两个层次.用户界面设计是屏幕产品的重要组成部分 在人和机器的互动过程(Human Machine Interaction)中,有一个层面,即我们所说的界面(interface).从心理学意义来分,界面可分为感觉(视觉.触觉.听觉等)和情感两个层次.用户界面设计是屏幕产品的重要组成部分.界面设计是一个复杂的有不

用户界面设计文档:手指友好型设计

文章描述:手指友好型设计-为了更好的点击而设计. 玩飞镖的时候,靶心是最难射中的位置,因为靶心是整个靶面上面积最小的部分.越是小的目标,就越是难以达到.这个准则在移动设备的触摸屏幕上同样适用. 众所周知,对于触屏设备用户来说,面积小的目标比面积大的目标更难操纵.所以,在设计移动设备界面的时候,触控目标一定要充分的大,足以让用户操作自如.但是多大才算充分呢?多大才是对于大多数用户最合适的尺寸呢?各大移动设备开发者已经认识到这个问题,最常见的做法是在各大厂商的用户界面设计文档中寻找答案. 那么,设计

如何进行用户界面设计

  用户界面设计是屏幕产品的重要组成部分.它是人与机器交流的一个重要渠道,通过用户界面,用户可以将实行各种操作.而要满足用户需求,那么用户界面设计就必须弄清楚用户心理,因此用户界面设计是集多种学科于一体的设计,对设计师要求比较高.用户界面设计在工作流程上分为结构设计.交互设计.视觉设计三个部分. 结构设计 结构设计也成概念设计,是界面设计的骨架.通过对用户研究和任务分析,制定出产品的整体架构.基于纸质的的低保真原型可提供用户测试并进行完善.在结构设计中,目录体系的逻辑分类和语词定义是用户易于理解

什么是UI设计中的用户研究、交互设计、界面设计

UI的本意是用户界面 ,是英文User interface的缩写.从字面上看用户界面包括 用户.界面这两个组成部分,但实际上还包括用户与界面之间的交互关系,所以用户界面设计 包括用户研究.交互设计.界面设计三个方面. 1.用户研究 用户研究包含两个方面:一是可用性工程学(usability Engineering),研究如何提高产品的可用性,使得系统的设计更容易被人使用.学习和记忆;二是通过可用性工程学的研究,发掘用户的潜在需求,为技术创新提供另外一条思路和方法(consumer insight

Android用户界面设计:线性​​布局

理解布局对于良好的Android程序设计来说很重要.在这个教程中,你将学习到所有关于线性布局的东西,它在屏幕上垂直地或水平地组织用户界面控件或者小工具.使用得当,线性布局可以作为基本的布局,基于这个布局来可以设计出许多有趣的Android程序用户界面. 什么是线性布局 线性布局是最简单,Android开发者使用得最多的布局类型之一,开发者用它来组织你们的用户界面上的控件.线性布局的作用就像它的名字一样:它将控件组织在一个垂直或水平的形式.当布局方向设置为垂直时,它里面的所有子控件被组织在同一列中

什么才是优秀的用户界面设计

什么才是优秀的用户界面设计 时间:2014-12-07 13:04 来源:未知 作者:包子 今天为大家分享一些 Good UI 在一些项目中 获取的设计以及运营策略等方面的经验. 这是本人收藏了很久的干货,最近开始做网站产品,又把它翻出来了. Good UI 是一家研究用户体验的设计机构.我们知道成功的页面设计不仅有很高的转化率更便于用户使用,既能满足商业目标更能为用户带来良好的体验. 1. 用通栏布局代替多栏布局 2. 给用户些 好处,别急着做生意 3. 整合相似的功能,去掉零碎的 UI 元素

细节成就卓越——浅析iPhone用户界面设计精粹

作为一款革命性产品,iPhone(这里泛指iPhone和iPod touch,当然还有iPad)为我们带来了许多意想不到的创意和惊喜.过去两个月多的时间里,我们认真地咀嚼<iPhone-Human-Interface-Guidelines>,感悟字里行间透露着的苹果的细致与智慧.兴奋.激动之余,有太多的惊喜想与大家分享.但无论从时间上还是精力上,130页的完整套餐肯定会让所有的人吃不消.我们收集了iPhone平台的专业设计师的意见,加上翻译过程的一点体会,整理出11条设计精粹.最后,希望这份1