我正在尝试以编程方式创建一个新的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中应用样式有什么区别?
答案 0 :(得分:2)
您不应该将layout_*
属性视为儿童风格的一部分(在这种情况下为ListView
)。
layout_*
属性在添加子项的父项的上下文。他们告诉父母在哪里定位以及如何布置孩子(孩子没有这个逻辑)。
在这一行:
ListView myListView = new ListView(getActivity(), null, R.attr.myListViewStyle);
所有属性都传递给ListView
,样式将应用于ListView
本身。它没有任何父级 - 它只是新创建的对象尚未附加到视图层次结构。
someContainerView.addView(myListView);
这是为{child}分配LayputParams
的行。您没有指定任何LayoutParams
(此方法有不同版本),因此将使用默认版本。