在Android平台上的各种屏幕尺寸的执行和系统调整大小正常应用程序的用户界面。以适应每一个人。

通常情况下,你须要做的是设计你的UI是灵活的,并通过提供替代资源(如又一次定位的一些看法观点或替代尺寸值替代布局)优化不同尺寸的一些元素。可是,有时你可能想更进一步优化不同屏幕尺寸的总体用户体验。

比如。平板电脑报价在您的应用程序可呈现信息的多组再一次的空间,而手机设备通常须要你除了那些分裂和集分别显示出来。

因此,即使专为手机的UI将正确地调整以适应平板电脑。它没有充分利用平板电脑的屏幕的潜力,提升用户体验。




与Android 3.0(API级别11),Android的推出了一套全新架构的API,让你更有效地设计出带大屏幕的优势活动:该片段的API。片段让你UI的不同行为成分分离成独立的部分。然后你就能够结合起来,创造在手机上执行时,在不同的活动片剂或原地踏步的时候多窗格布局。 Android 3.0的还推出了动作条,而在屏幕识别应用程序。并提供用户操作和导航的顶部提供了一个专用的用户界面。




本文件提供指导,能够帮助您创建,提供了两个手机和平板电脑独特的和优化的用户体验,使用碎片和操作栏的应用程序。


继续之前本指南,这一点非常重要,你先阅读指导,以支持多种屏幕。

该文件描写叙述了开发支持不同的屏幕尺寸和密度分别为灵活的布局和替代位图。一个UI的基本设计原则。




基本方针


这里有一些指导方针,这将有助于您创建提供平板电脑和手机优化用户体验的应用程序:


构建基于你能够在不同的重用组合。在手机上的平板电脑和单窗格布局多窗格布局片段您的活动设计。
一个片段代表的行为或活动的用户界面的一部分。你能够把一个片段作为一项活动(活动的“片段”)。它有它自己的生命周期,并能够加入或活动执行时卸下的模块化部分。
假设你还没有使用碎片的是,通过阅读片段开发者指南開始。


使用操作栏,但遵循最佳实践,并确保你的设计是系统调整基于屏幕尺寸的操作栏布局不够灵活。


在ActionBar是活动的一个UI组件,在屏幕的顶部代替了传统的标题栏。

默认情况下,操作杆包含在左側的应用程序的标志,随后的活动标题,并获得从右側的选项菜单项。
您能够启用从选项菜单项直接在操作栏为“行动项目”出现。您还能够加入导航功能的操作栏,如制表符或一个下拉列表,并使用应用程序图标的选项,以补充系统的后退button行为,浏览到您的应用程序的“家”活动或“涨”应用程序的结构层次。
本指南提供了同一时候支持平板电脑和手机的方式使用操作栏的一些技巧。

对于操作栏API的具体讨论。请參阅操作栏开发者指南。
实施灵活的布局。作为最佳实践支持多种屏幕和博客文章,思维就像一个网页设计师讨论。
一个灵活的布局设计,让你的应用程序。以适应屏幕尺寸的变化。不是全部的片具有同样的尺寸,也不是全部的手机的大小同样。

尽管你可能会为“平板电脑”和“手机”提供不同的片段组合,它仍然是必要的,每个设计灵活,以调整在尺寸和长宽比的变化。
以下的章节中具体讨论前两个建议。有关创建灵活布局的很多其它信息,请參阅上面提供的链接。




注:除了操作栏中的一个特征。来完毕本文档中的建议所需的全部API都能够在Android 3.0的。此外,你甚至能够实现片段的设计模式。并保持与Android 1.6的向后兼容,用下側栏库讨论了支持。




创建单窗格和多窗格布局


剩余向后兼容


假设你想在你的应用程序中使用的碎片,并保持与Android版本号早于3.0版兼容,您能够通过使用Android的支持库(从SDK管理器中下载)这样做。




支持库包含片段,装载机,并在Android中的较新版本号中加入的其它API的API。通过简单地加入这个库到你的Andr​​oid项目,您能够使用这些API的向后兼容的版本号,在您的应用程序。并保持与Android兼容1.6(在Android:值的minSdkVersion可低至“4”)。

有关怎样获取该库,并開始使用它的信息。请參阅支持库文件。


支持库不提供操作栏的API。但你能够使用代码演示样例应用程序。操作栏的兼容性。创建一个支持全部设备的操作栏。
创建平板电脑和手机一个独特的用户体验。最有效的方法是创建片段的不同组合,平板电脑,这样你能够设计“多窗格”布局和手机“单一平台”布局的布局。比如,在片剂的新闻应用程序可能显示的物品在左側的列表和在右側,选择左側的物品更新右側的物品视图一个完整的文章。在手机上。可是,这两种成分应出如今单独的屏幕-从列表中选择的物品改变整个屏幕以显示物品。有两种方法来完毕这个设计片段:


多个片段。一个活动:使用一个活动不管设备的大小,但在执行时决定是否在布局片段组合(创建多窗格设计)或交换片段(创建一个单一的窗格设计)。要么...
多个片段。多重活动:在平板电脑上,将多个片段在一个活动;在手机上,使用单独的活动举办的每一个片段。

比如,当片剂设计中的活性使用两个片段。用于手机同样的活性,但提供一个替代的布局仅仅包含第一片段。当在手机上执行。​​你须要切换片段(当用户选择一个项目,如),開始承载第二个片段的还有一个活动。
您选择的方法取决于你的设计和个人喜好。

第一个选项(一个活动,交换片段),您须要确定屏幕尺寸在执行时动态地在您的活动的XML加入的每一个片段作为适当的。而不是申报片段布局。由于你不能从活动中删除片段,假设它已经在XML布局声明。当使用第一种技术,可能还须要每次片段更改更新操作栏。取决于什么行动或导航模式可用于每一个片段。

在某些情况下,这些因素可能不会影响您的设计,因此使用一个活动和交换片段能够工作(特别是假设你的平板电脑的设计须要您动态加入片段反正)。其它时候,然而,动态交换片段为您的手机设计能够使你的代码变得更加复杂,由于你必须管理在活动的代码中的全部片段组合(而不是使用替代布局资源来定义片段组合)和管理片段回栈自己(而不是同意正常活动栈处理回导航)。


本指南重点介绍了第二个选项。在当中您在一个单独的活动时更小的屏幕上显示的每一个片段。使用这样的技术意味着你能够使用不同的屏幕大小定义不同的片段组合替代的布局文件,保持片段代码模块化,简化了操作栏的管理。并让系统在手机上所有回栈工作。


图1展示了怎样用两个片段应用程序可能被安排为手机和使用手机设计不同的活动时,片:




图平板电脑和手机1.不同的设计模式,在选择项目时要查看其具体信息。


在图1所看到的的应用程序,活动A为“主活动”,并使用不同的布局的时间,以显示一个或两个片段取决于屏幕的尺寸:


在平板电脑大小的屏幕。活动布局包括片段A和B.片段
在手机大小的屏幕,活动布局中仅仅包括片段A(列表视图)。

为了显示在片段B的细节。活动B必须打开。


注:活动B是从来没有在平板电脑上使用。它不过呈现片段B的容器中。所以仅在手持装置中使用时。两个片段必须单独显示。


依据不同的屏幕尺寸,系统採用不同的main.xml布局文件:


对于手机RES /布局/ main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- "Fragment A" -->
    <fragment class="com.example.android.TitlesFragment"
              android:id="@+id/list_frag"
              android:layout_width="match_parent"
              android:layout_height="match_parent"/>
</FrameLayout>
res/layout-large/main.xml for tablets:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/frags">
    <!-- "Fragment A" -->
  <fragment class="com.example.android.TitlesFragment"
            android:id="@+id/list_frag"
            android:layout_width="@dimen/titles_size"
            android:layout_height="match_parent"/>
    <!-- "Fragment B" -->
  <fragment class="com.example.android.DetailsFragment"
            android:id="@+id/details_frag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>
注意:尽管平板电脑上面的演示样例布局是基于“大”屏幕配置预选赛中。你也应该使用新的“最小宽度”大小限定,以更精确地控制在其系统应用你的手机或平板电脑的屏幕尺寸布局。请參阅側栏以获取很多其它信息。
怎样当用户从列表中选择一个项目取决于片段B是否是在布局中可用的应用程序响应:
假设片段B是在布局,活动一个通知片段B进行自我更新。


假设片段B不在布局。活动A開始活动B(它承载片段B)。
为了实现这样的模式的应用程序时。你发展你的片段是高度条块切割非常重要。详细来说,您应该遵循两个原则:
不要直接从还有一个操纵一个片段。
记住,涉及内容片段的片段里,而不是把它在主机活动代码的全部代码。
为了避免直接调用从还有一个片段,定义,它能够使用来提供事件对其宿主的活动。这实现回调接口的每一个片段类的回调接口。当活动收到回调因为一个事件(比如用户选择列表项),在活动做出响应适当地基于当前片段配置。
比如。活动A从上面能够取决于它是否是使用这种平板电脑或手机的布局处理项目选择:

public class MainActivity extends Activity implements TitlesFragment.OnItemSelectedListener {
    ...

    /** This is a callback that the list fragment (Fragment A)
        calls when a list item is selected */
    public void onItemSelected(int position) {
        DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
                                    .findFragmentById(R.id.display_frag);
        if (displayFrag == null) {
            // DisplayFragment (Fragment B) is not in the layout (handset layout),
            // so start DisplayActivity (Activity B)
            // and pass it the info about the selected item
            Intent intent = new Intent(this, DisplayActivity.class);
            intent.putExtra("position", position);
            startActivity(intent);
        } else {
            // DisplayFragment (Fragment B) is in the layout (tablet layout),
            // so tell the fragment to update
            displayFrag.updateContent(position);
        }
    }
}
当显示活动(活动B)启动时,它读取由意向提供的数据,并将其传递到显示片段(片段B)。


假设片段B须要提供一个结果返回给片段A(由于活动B開始与startActivityForResult()),则处理与片段B和活性B.也就是说之间的回调接口工作方式类似。活动B实现了一个不同的回调接口由片段B.当活动B接收与来自所述片段的结果回调定义,它设置的结果为活性(用的setResult()),并完毕自身。活动A然后接收结果并将其传递到碎片A.
对于这样的技术用于创建平板电脑和手机的不同片段组合的演示,看到蜂窝图库样张的更新版本号。
使用操作栏
操作栏是在平板电脑和手机的Andr​​oid应用的一个重要UI组件。为了确保操作栏适当的行为在全部的屏幕尺寸,则须要使用的动作条的API不添加复杂的定制是非常重要的。通过使用标准的API的ActionBar来设计你的动作条,Android系统做全部的工作,以适应正常为不同的屏幕尺寸操作栏。

以下是创建你的动作条时,须要遵循一些重要提示:
当设置为一个操作项菜单项,避免使用“总是”的价值。在你的菜单资源,用“ifRoom”为Android:showAsAction属性,假设你想的菜单项出如今动作条。可是,您可能须要“永远”的时候一个动作视图不提供溢出菜单中选择默认操作(即,它必须作为一个动作视图)。

可是,你不应该使用“总是”不是一次或两次以上。当您希望的项目显示为一个操作项:“showAsAction机器人”在差点儿全部其它情况下,用“ifRoom”作为值。

迫使太多的操作项目进入操作栏能够创建一个杂乱的用户界面和操作项能够与其它动作条元素,如标题或导航项目重叠。
当加入行动项目与文字标题的操作栏,还提供了一个图标。在适当的时候,并宣布showAsAction =“ifRoom | withText”。

这样的方式。假设没有足够的空间的标题,但有足够的空间用于该图标,则能够仅使用的图标。
始终为您的行动项目提供标题,即使你不启用“withText”。由于用户能够通过该项目,标题文本进行了“长按”查看标题为“工具提示”。在出现短暂敬酒的消息。提供了一个标题也可訪问性至关重要,由于屏幕阅读器朗读该项目冠军。即使不可见。
应尽可能避免在使用自己定义导航模式。使用内置的标签和下拉导航模式时可能 - 它们设计,使该系统能适应他们的介绍,以不同的屏幕尺寸。

比如,当宽度是两个标签和其它行动项目(如纵向手机)太窄,选项卡显示在操作栏下方(这被称为“堆积操作栏”)。

假设你必须建立操作栏中的自己定义导航模式或其它自己定义的意见,对其进行全面測试在小屏幕上。并进行必要的调整。以支持一个狭窄的操作栏。
比如,以下的实物模型演示系统可适应怎样依据可用的屏幕空间的行动吧。

在手机中。仅仅有两个行动项目契合,因此剩下的菜单项出如今溢出菜单(因为Android:showAsAction被设置为“ifRoom”)和标签出如今一个单独的行(堆叠操作栏)。在平板电脑上,採取很多其它的行动项目可适合在动作条等方面做了标签


图2.实物模型展示了怎样基于可用的屏幕空间系统又一次配置即可动起来吧成分。




使用拆分操作栏


当您的应用程序在Android4.0(API级别14)和更高的执行。有可供调用操作栏额外的模式,“拆分操作栏”。当您启用拆分操作栏,一个单独的酒吧出如今屏幕时显示活动狭窄的屏幕上执行的全部行动项目的底部(如人像手机)。拆分操作栏确保了空间的合理数量是提供给一个狭窄的屏幕上显示操作项目。也是留有余地的顶部导航和标题元素。




要启用拆分操作栏,仅仅需加入uiOptions=“splitActionBarWhenNarrow”你的<活动>或<应用>清单元素。



在左側导航选项卡图3.拆分操作栏;与应用程序图标和标题右側禁用。




假设你想隐藏在顶部的主要动作吧,由于你使用内置的导航选项卡的拆分操作栏一起。呼吁setDisplayShowHomeEnabled(false)来取消操作栏中的应用程序图标。在这样的情况下,如今所剩无几的主要行动起来吧,所以它消失。全部剩下的是顶部的导航选项卡。并在底部的操作项,如图3所看到的的第二个设备。


注意:尽管uiOptions属性是在Android 4.0的(API级别14)加入。你能够放心地将其包括在即使你的minSdkVersion被设置为“14”的值以保持与旧版本号的Andr​​oid兼容应用程序。当在旧版本号上执行时。系统会忽略的属性。由于它不理解它。将它加入到你的清单中的唯一条件是,你必须编译你的反对,支持的API级别14或更高的平台版本号的应用程序。仅仅要确保你不公开使用的应用程序代码其他API不是由你的minSdkVersion属性所声明的版本号支持。


使用“向上”导航


因为在Action Bar开发人员指南中所讨论的。能够使用应用程序图标操作栏中。以方便用户导航在适当的时候。不管是作为一个方法来获得回“家”的活动(类似于点击一个站点上的标志)或作为方式向上导航应用程序的结构的层次结构。尽管似乎类似于在某些情况下,标准回到导航。向上导航选项提供了更加可预測的导航方法,当中用户可能已经从外部位置输入的情况下。诸如通知,应用程序插件,或不同的应用程序。




当在不同的设备不同的组合使用的碎片。它到你的了导航每一个配置中的行为给予额外的考虑是很重要的。比如。在手机上,你的应​​用程序时显示在同一时间仅仅有一个片段,它可能是适当的,以使上导航上去父画面,而它显示了一个多窗格配置同样的片段时。是没有必要的。


有关启用了导航的具体信息,请參阅操作栏开发者指南。




其它设计技巧


当一个ListView工作,考虑怎样你可能会提供基于可用空间每一个项目或多或少的信息。

也就是说,您能够创建替代布局将使用列表中的适配器的项目,使得大屏幕可能会显示每一个项目的具体信息。
创建如整数,尺寸。甚至为布尔值替代资源文件。

使用大小预选赛这些资源,能够方便地应用于不同的布局尺寸,字体大小。或启用/基于当前的屏幕大小禁用功能。