以编程方式创建具有自定义样式的ListView - 为什么android:layout_marginXY无法识别?

时间:2014-07-30 12:00:23

标签: android android-layout android-listview android-styles

我正在尝试以编程方式创建一个新的ListView并将自定义样式应用于:

// Somewhere within a Fragment...
ListView myListView = new ListView(getActivity(), null, R.attr.myListViewStyle);
someContainerView.addView(myListView);

// In attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="AppTheme">
        <attr name="myListViewStyle" format="reference"/>
    </declare-styleable>
</resources>

// in styles.xml
<style name="AppTheme" parent="AppBaseTheme">
    <item name="myListViewStyle">@style/ListViewStyle</item>
</style>

<style name="BookingsSectionListView" parent="@android:style/Widget.ListView">
    <!-- Setting the Padding DOES work... -->
    <item name="android:paddingLeft">50dp</item>

    <!-- ...while setting the Margin has NO effect -->
    <item name="android:layout_marginTop">50dp</item>  
</style>

虽然创建ListView没有问题,但未正确应用自定义样式。无法识别android:layout_marginXY属性,因此未正确放置ListView。如果我使用android:paddingX而是一切正常。 为什么?

如果我不是以编程方式创建ListView,而是直接以XML格式创建ListView并将样式应用于它,则android:layout_marginXY属性可以正常工作。

创建ListView和在XML或Java中应用样式有什么区别?

1 个答案:

答案 0 :(得分:2)

您不应该将layout_*属性视为儿童风格的一部分(在这种情况下为ListView)。
layout_*属性在添加子项的父项的上下文。他们告诉父母在哪里定位以及如何布置孩子(孩子没有这个逻辑)。

在这一行:

ListView myListView = new ListView(getActivity(), null, R.attr.myListViewStyle);

所有属性都传递给ListView,样式将应用于ListView本身。它没有任何父级 - 它只是新创建的对象尚未附加到视图层次结构。

someContainerView.addView(myListView);

这是为{child}分配LayputParams的行。您没有指定任何LayoutParams(此方法有不同版本),因此将使用默认版本。