`
liuguofeng
  • 浏览: 453550 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android布局技巧:创建高效布局

 
阅读更多

Android UI工具包提供了一些布局管理器,它们使用起来相当容易,而且,大多数的时候,你只需要使用它们最基本的特征来实现UI。

执着于基本特征的使用对于创建UI来说,往往不是最高效的。一个常见的例子就是滥用LinearLayout,它将会导致View树中的View数量激增。View——更糟的是,布局管理器——添加到应用程序里都会带来一定的消耗:初始化,布局和绘制变得更加缓慢。嵌套布局的花销尤其“昂贵”,例如,如果你嵌套了一些LinearLayout,并使用了weight参数,这会导致子元素要计算两次。

让我们看一个非常简单且常见的布局例子:一个列表项,左边是一个图标,右边是标题和描述,上方是标题,下方是可选的描述。列表项可能看起来如下图:

                   

                  

为了清楚地认识View之间(一个ImageView和两个TextView)的相对位置,下图是使用HierarchyViewer抓获的布局剪影:

                                    

   实现这个布局,直接使用LinearLayout就可以了。列表项本身是一个水平的LinearLayout,里面有一个ImageView和一个垂直的LinearLayout,垂直的LinearLayout里包含两个TextView。以下是这个布局的源代码:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="My Application" />
        <TextView  
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" 
            android:singleLine="true"
            android:ellipsize="marquee"
            android:text="Simple application that shows how to use RelativeLayout" />
        </LinearLayout>
</LinearLayout>

 

如果你将它作为ListView的item,它能正常工作,但却是相当浪费的。相同的布局可以使用RelativeLayout进行重写,相对于每个列表项来说,可以节省一个View,且View层级上更好,只有一层。使用RelativeLayout也很简单:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
<TextView  
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip" 
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/secondLine"
        android:layout_alignWithParentIfMissing="true"
        android:gravity="center_vertical"
        android:text="My Application" />
</RelativeLayout>

新的实现与老的实现看起来效果完全一致,除了一种情况。每个列表项显示两行文字:标题和可选的描述。当某一个列表项的描述不可获得时,应用程序可能希望将第二个TextView的Visibility设为GONE。LinearLayout实现版表现得很完美,但RelativeLayout实现版就有点差强人意了:

在RelativeLayout里,每个View都是和父元素RelativeLayout对齐或是和其它View对齐的。例如,我们声明描述部分是和RelativeLayout的底部对齐,标题位于其上并与RelativeLayout的顶端对齐。当描述GONE时,RelativeLayout不知道怎么去放置标题的底边缘。为了解决这个问题,你可以使用一个非常简单的布局参数:layout_alignWithParentIfMissing。

这个布尔参数告诉RelativeLayout:如果目标对象消失时使用自己的边缘作为锚点。例如,如果你放置一个View到另一个Visibiity属性设为GONE的View的右边,且设定alignWithParentIfMissing为true,RelativeLayout就会将其左边缘作为View的对齐锚点。在我们的这个场合,使用alignWithParentIfMissing的结果是RelativeLayout将标题部分的底部与自己的底部对齐。结果如下所示:

现在,我们的布局表现得很完美了,即使描述部分的Visibility属性设为GONE。更好的是,层级更加简单,因为我们不再使用LinearLayout,而且,更加高效了。当我们使用HierarchyViewer来比较两个实现版的时候,事实就更明显了:

另外,当你使用这么一个布局作为ListView的列表项时,这种差异就更为重要了。希望这个简单的例子能让你了解布局,了解如何优化你的UI。

分享到:
评论

相关推荐

    Android Studio实战:快速高效地构建Android应用

    通过阅读《Android Studio实战:快速高效地构建Android应用》,开发者不仅可以掌握Android Studio的使用技巧,还能了解到完整的Android应用开发流程,从而提升开发效率和应用质量。书中可能还会包含实际项目案例,...

    Android布局技巧之创建高效布局

    本篇文章主要探讨如何创建高效的Android布局,以提高应用性能和减少资源消耗。 首先,我们来看一个常见问题:LinearLayout的过度使用。LinearLayout允许线性地排列子视图,但是当过度嵌套时,会导致性能下降。比如...

    Android、教程<经典> 2 Android布局

    本教程将深入探讨Android布局的各个方面,帮助开发者掌握创建高效、可扩展且美观的用户界面的技巧。 首先,我们来了解Android布局的基础知识。Android提供了多种布局类型,每种都有其特定的用途: 1. **线性布局...

    android 布局别名的应用

    在Android开发中,布局别名(Layout Aliases)是一种实用的技术,它可以帮助开发者更高效地管理应用程序的界面布局,尤其是在处理屏幕适配问题时。本文将深入探讨布局别名的概念、用途以及如何在实际项目中应用。 #...

    android布局技巧

    ### Android布局技巧详解 在Android应用开发中,布局设计是构建用户界面的关键步骤。良好的布局不仅能够提升用户体验,还能优化应用性能。本文将深入探讨Android布局的技巧,帮助开发者掌握如何利用基本布局组件...

    Android xml布局文件生成工具

    "新版Android开发教程+笔记十一--可视化UI设计DroidDraw.pdf"可能是关于如何使用DroidDraw进行UI设计的教程文档,涵盖了使用DroidDraw的基本操作和技巧,包括如何创建活动(Activity)、设置控件属性、组织布局结构...

    ch05 Android布局

    总结,Android布局是构建用户界面的核心工具,理解和掌握各种布局类型、参数和优化技巧对于提升应用的用户体验和性能具有重要意义。通过不断的实践和学习,开发者可以创造出更富吸引力和高效交互的Android应用。

    Android页面布局代码

    这里我们将深入探讨Android布局的一些核心概念、常用布局类型以及布局代码的编写。 1. **XML布局文件**: Android使用XML文件来定义界面布局。这些文件通常位于项目的`res/layout`目录下,以`.xml`为扩展名。XML...

    android 相对布局

    4. 调试布局:使用Android Studio的预览功能,可以在设计视图中实时调整和预览布局效果,以确保布局在不同设备上表现一致。 总结来说,Android的相对布局是一个强大且灵活的工具,它让开发者能够更加自由地设计界面...

    xamarin.android 布局文件自动提示功能

    "Xamarin.Android布局文件自动提示功能"是指在使用Visual Studio或Visual Studio for Mac等集成开发环境(IDE)时,编辑器提供的智能代码补全和提示功能,它能显著提高开发效率,减少错误。本文将深入探讨这个功能,并...

    菜鸟Android开发系列之:线性布局

    例如,使用两个垂直排列的线性布局来创建两栏布局: ```xml android:orientation="vertical"&gt; android:orientation="horizontal"&gt; &lt;!-- 第一栏子视图 --&gt; android:orientation="horizontal"&gt; &lt;!-- 第二...

    Android布局技巧之创建可重用的UI组件

    在Android开发中,创建可重用的UI...合理使用`&lt;include&gt;`,配合其他布局技巧如`&lt;merge&gt;`标签,能够使你的Android应用布局更加灵活且高效。在实际开发中,应积极实践这些布局策略,以提高代码质量并提供更好的用户体验。

    android五种布局例子

    在Android开发中,布局(Layout)是构建用户界面的基础元素,它...同时,随着对布局的理解加深,你还可以探索更高级的布局技巧,如嵌套布局、使用Include标签进行布局复用,以及使用约束布局的Chain和Barrier特性等。

    初学android布局实例

    初学者在接触Android布局时,通常会从简单的线性布局(LinearLayout)、相对布局(RelativeLayout)开始,然后逐渐深入到帧布局(FrameLayout)和约束布局(ConstraintLayout)等更复杂的布局方式。这个“初学...

    徐宜生-Android群英传:神兵利器

    此外,书中的“神兵利器”还包括了对Android最新特性的解析,如Material Design设计指南、Android Jetpack组件库的使用,以及Android Studio的高效开发技巧等。通过这些深入浅出的讲解,读者不仅能掌握Android开发的...

    android中的布局

    在Android开发中,布局(Layout)是构建用户界面的核心元素,它定义了...通过合理运用各种布局类型和技巧,可以创建出高效、美观且易于维护的用户界面。在实际开发中,还要根据项目需求和用户体验不断优化布局设计。

    android 布局管理

    在Android开发中,布局...总结,Android布局管理是构建高效、美观用户界面的基础。理解并熟练掌握各种布局及其属性,以及优化技巧,对于提升应用质量至关重要。在实践中不断探索和优化,才能打造出优秀的Android应用。

    Android程序源码--代码布局

    在Android应用开发中,代码布局是至关重要的一个环节...了解并熟练掌握这些代码布局技巧,将有助于提升Android应用的用户体验和开发效率。在实际项目中,应根据需求灵活运用各种布局策略,实现高效、易维护的代码结构。

    android 开发技巧总汇

    为了实现高效的布局设计,开发者还可以使用LayoutInflater来动态加载布局,以及使用RecyclerView和ListView来展示大量数据,它们通过Adapter与数据源绑定,实现列表滚动时的高效复用。 以上就是Android开发中的一些...

Global site tag (gtag.js) - Google Analytics