使用LinearLayout的嵌套权重的替代方案

7
我希望实现以下内容: enter image description here 它适用于以下布局:
<?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">

    <LinearLayout
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <fragment 
            android:name="com.bobjohn.DetailsMenuFragment"
            android:id="@+id/detailsMenuFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="6"
            />

        <fragment 
            android:name="com.bobjohn.SummaryFragment"
            android:id="@+id/summaryFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_margin="10dp"
            android:layout_weight="4"/>
    </LinearLayout>

    <TextView 
        android:layout_width="0dp"
        android:layout_weight="7"
        android:layout_height="fill_parent"
        android:text="Test Text"/>
</LinearLayout>

然而,我收到了有关嵌套权重对性能不利的警告。我理解这个错误,但我不知道如何用另一种方式表达此布局。有什么替代方案吗?


附上它了吗?你看不到吗? - steprobe
可能是这里的防火墙阻止了它。 - Vishal Pawar
我曾经遇到过类似的问题,你找到了更好的解决方案吗?也许编写自定义布局会更好? - karabara
正如Luke47在下面的评论中提到的那样,我认为在这里我们可以安全地忽略深度仅为2。 - steprobe
这是一篇关于布局优化的绝佳文章:http://developer.android.com/training/improving-layouts/optimizing-layout.html - Muhammad Babar
3个回答

7

支持库中有新的更新,请查看已接受的答案。

更新的答案:

无论何时创建任何视图,它都会调用其度量事件以了解屏幕上视图的高度宽度。如果您不使用WRAP_CONTENT或FILL_PARENT或FIXEDSIZE并使用权重,则在屏幕上呈现布局变得更加复杂。

意思是,

首先呈现主要布局并调用其度量..然后基于权重,所有子视图递归地调用其度量事件,因此加载需要更多时间。

所以应避免嵌套权重

嵌套权重的替代方法:

您应该考虑使用特定于不同大小的不同布局和可绘制文件夹。在XML中编写您的视图具有特定的高度宽度或使其wrap_content并使用特定的背景图像或使其fill_parent。

我相信作为开发人员,我们可能会犯错多次,但作为Android(Lint)的创作者,他们只有在极少数情况下才会出错,应该听取这些警告以使您的代码更好。


以下答案缺乏关于Android布局的知识而编写

据我所知,我认为您做得对,这是相同的最佳编写XML。 您已完美地使用了weight属性。只需忽略警告即可。

有什么替代方法吗?

我已在我的项目中以相同的方式编写了所有XML,因此这对我来说是最好的替代方法,所以我认为没有其他替代方法可以编写XML以获取此类布局,除非您使用具有一些固定大小的子视图高度和宽度的RelativeLayout作为父布局。我建议您保持原样。


我本应该删除此答案,因为我仍然不完全了解Android布局,但保留它以便根据此接收新评论和答案


1
我同意。我曾经需要设计一个像截图中的UI一样的界面,最终使用了嵌套权重。我理解为什么Lint会抱怨嵌套权重,但在你的情况(就像在我的情况下)由于树深度为2,我建议忽略警告以确保安全...性能损失应该是微不足道的。 - Luke47

3
是的,我们可以使用Android的百分比支持库来替代嵌套的LinearLayout权重。以下是一个简单的布局示例,完全避免了使用LinearLayout的权重属性。

点击此处查看代码和概念!

GitHub项目在这里!

Percent support library

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/fifty_huntv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ff7acfff"
        android:text="20% - 50%"
        android:textColor="@android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/fifty_huntv"
        android:background="#ffff5566"
        android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</android.support.percent.PercentRelativeLayout>

非常棒!!!


感谢您提供这个好的和新的答案! - MKJParekh

0

我认为(我可能会因此而受到攻击),但我认为我的手机拥有四核处理器,可以与大多数人的家用电脑相媲美(如果不是完全超越)。

我也认为这种硬件能力是手机的未来。

所以我得出结论,只要你不过分嵌套(在我看来,布局永远不应该超过4层深,如果超过了,你可能做错了),你的手机对于有没有权重并不在意。

有很多事情可以做,对性能的影响更加深远,比如担心处理器做一些额外的数学运算。

(请注意,我有点幽默,所以不要从这篇文章中太认真地看待任何事情,除了这个想法:有其他事情你应该先优化,而担心2-3层深度的权重并不能帮助你的健康)


手机在处理能力方面仍然远远落后于台式机,但其余部分听起来像是很好的建议 :) - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接