动态应用图像样式时出错,为什么?

时间:2011-10-03 01:47:12

标签: android image resize styles

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>

为什么?

2 个答案:

答案 0 :(得分:2)

前缀为layout_的任何属性都是LayoutParams对象的一部分。 LayoutParams是父视图关于如何布局子视图的特殊参数。您在视图上设置的LayoutParams类型取决于要将其添加到的ViewGroup的类型。每个容器视图类型可以不同,LayoutParams也可以。 layout_weight特定于LinearLayout,layout_below专用于RelativeLayout等。layout_widthlayout_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