attrs.xml:
<declare-styleable name="AppTheme">
<attr name="actionbarCompatLogoStyle" format="reference" />
</declare-styleable>
styles.xml:
<style name="Theme.MyApp" parent="android:style/Theme.Light">
<item name="actionbarCompatLogoStyle">@style/ActionBarCompatLogo</item>
</style>
<style name="ActionBarCompatLogo">
<item name="android:layout_width">30dp</item><!-- original image is huge -->
<item name="android:layout_height">30dp</item>
<item name="android:src">@drawable/app_logo</item>
</style>
问题:如果我使用它,图片尺寸将无效(巨幅图片):
ImageButton logo = new ImageButton(context, null, R.attr.actionbarCompatLogoStyle);
如果我使用它,它可以工作(图像很小,这就是我想要的):
<ImageView style="@style/ActionBarCompatLogo"></ImageView>
为什么?
答案 0 :(得分:2)
前缀为layout_
的任何属性都是LayoutParams
对象的一部分。 LayoutParams是父视图关于如何布局子视图的特殊参数。您在视图上设置的LayoutParams类型取决于要将其添加到的ViewGroup的类型。每个容器视图类型可以不同,LayoutParams也可以。 layout_weight
特定于LinearLayout,layout_below
专用于RelativeLayout等。layout_width
和layout_height
是ViewGroup LayoutParams基础的一部分。
从中可以看出,LayoutParams不是由视图的构造函数解析的,它们是由上面的代码没有执行的另一个步骤解析的。 (LayoutInflater涉及父ViewGroup的generateLayoutParams
方法。)
由于LayoutParams依赖于View的预期父级,因此不建议将LayoutParams放在样式中。当您从布局XML中扩展视图时,它主要是,但它具有类似于您在此处找到的边缘情况的其他含义,并且需要您了解它们。例如,样式可以为LinearLayout指定layout_weight
,但如果将具有该样式的视图添加到RelativeLayout,则它将不会按预期运行,因为RelativeLayout不支持layout_weight
。
答案 1 :(得分:0)
据我所知,不可能以编程方式将样式应用于特定视图,只能通过XML。
您可以做的是在onCreate()
方法中为您的活动设置主题。请参阅此问题:android dynamically change style at runtime