【问题标题】:Android Layout optimization for ListView of ArrayAdapter: is FrameLayout really useless?ArrayAdapter的ListView的Android Layout优化:FrameLayout真的没用吗?
【发布时间】:2017-09-11 15:53:59
【问题描述】:

我为我的应用创建了一个颜色目录,并决定使用一个数组适配器来扩充这个目录。我的颜色布局如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="40dp"
        android:layout_marginEnd="40dp">

        <ImageView
            android:id="@+id/fav_swatch"
            android:layout_width="80dp"
            android:layout_height="match_parent"/>

        <TextView
            android:id="@+id/fav_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/fav_swatch"
            android:layout_toEndOf="@+id/fav_swatch"
            android:paddingLeft="30dp"
            android:paddingStart="30dp"
            android:paddingTop="10dp"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/fav_coord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/fav_swatch"
            android:layout_toEndOf="@+id/fav_swatch"
            android:layout_below="@+id/fav_name"
            android:paddingLeft="30dp"
            android:paddingStart="30dp"
            android:paddingTop="10dp"
            android:textSize="20sp"
            />

        <ImageButton
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/ic_clear"/>

        <ImageButton
            android:id="@+id/btn_modify"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/btn_delete"
            android:layout_toStartOf="@+id/btn_delete"
            android:background="@drawable/ic_edit"/>

    </RelativeLayout>

</FrameLayout>

我的活动布局:

<?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">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fav_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin" />

    <ListView
        android:id="@+id/fav_lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </ListView>

</FrameLayout>

所以这段代码会导致所需的布局如下:

问题是Android会警告我

这个RelativeLayout或其父FrameLayout没用

这并不是真的没用,因为如果我只保留 RelativeLayout 作为父级:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:layout_marginLeft="20dp"
    android:layout_marginStart="20dp"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="20dp"
    android:layout_marginRight="40dp"
    android:layout_marginEnd="40dp"
    xmlns:android="http://schemas.android.com/apk/res/android">

        <ImageView
            android:id="@+id/fav_swatch"
            android:layout_width="80dp"
            android:layout_height="match_parent"/>

        <TextView
            android:id="@+id/fav_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/fav_swatch"
            android:layout_toEndOf="@+id/fav_swatch"
            android:paddingLeft="30dp"
            android:paddingStart="30dp"
            android:paddingTop="10dp"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/fav_coord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/fav_swatch"
            android:layout_toEndOf="@+id/fav_swatch"
            android:layout_below="@+id/fav_name"
            android:paddingLeft="30dp"
            android:paddingStart="30dp"
            android:paddingTop="10dp"
            android:textSize="20sp"
            />

        <ImageButton
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/ic_clear"/>

        <ImageButton
            android:id="@+id/btn_modify"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/btn_delete"
            android:layout_toStartOf="@+id/btn_delete"
            android:background="@drawable/ic_edit"/>

</RelativeLayout>

边距被忽略了,我得到了这种丑陋的布局:

我的问题是:有没有什么方法可以得到正确的布局,而不必放一个“无用的”FrameLayout 以获得更清洁和更优化的代码?

编辑:有趣的 java 代码:

// Construct the data source
        ArrayList<Colour> arrayOfColours = new ArrayList<>();

        final ColourAdapter adapter = new ColourAdapter(this, arrayOfColours);

        ListView lv = (ListView) findViewById(R.id.fav_lv);
        lv.setAdapter(adapter);

        final Colour[] colour = new Colour[ca.getMaxNumberOfFavColours()];
        for (int i = 0; i < numberOfColours; i++) {
            colour[i] = new Colour(colourPixel[i], colourName[i]);
            adapter.add(colour[i]);
        }

【问题讨论】:

    标签: android android-layout optimization warnings


    【解决方案1】:

    在您的场景中,FrameLayout 包含一个子元素 RelativeLayout。您的所有其他元素都包含在RelativeLayout 中。这可能是 Android Studio 向您发出警告的原因。

    这个RelativeLayout或者它的父FrameLayout是没用的。

    我不明白你在FrameLayout 中包含RelativeLayout 的意思。相反,我也建议使用其中任何一个。

    此外,您只需在第二种情况下执行此操作即可获得相同的结果...

    1. RelativeLayout 中删除边距。
    2. RelativLayout 中添加android:padding="20dp" 而不是边距。

    如果您对此有任何疑问,请告诉我。

    我会建议您 see the diff. in margin and padding 并避免为布局的最外层容器留出边距。

    PS:开发人员在警告变成错误之前不会给予太多关注。 :p

    【讨论】:

    • 填充是关键。我想我仍然需要更好地了解布局属性。谢谢!
    • 这些布局的东西,真的有时会造成很大的混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多