ArrayAdapter的ListView的Android布局优化:FrameLayout真的没用吗?

时间:2017-04-15 15:05:52

标签: android android-layout optimization warnings

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

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

所以这段代码导致了所需的布局:

Correct layout

问题是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>

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

Undesired layout

我的问题是:是否有任何方法可以获得正确的布局,而无需放置“无用的”#39; 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]);
        }

1 个答案:

答案 0 :(得分:1)

在您的方案中,FrameLayout包含一个子元素RelativeLayout。您的所有其他元素都包含在RelativeLayout中。可能是因为Android Studio会给你一个警告。

  

此RelativeLayout或其父FrameLayout无用。

我不明白你在RelativeLayoutFrameLayout的观点。相反,我也建议使用其中任何一个。

此外,只需在第二个场景中执行此操作即可获得相同的结果...

  1. RelativeLayout删除保证金。
  2. 而不是保证金,请在android:padding="20dp"。{/ li>中添加RelativLayout

    如果您对此有任何疑问,请与我们联系。

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

    PS:开发人员在出现错误之前不会过多关注警告。 :P