Android忽略styles.xml中的layout_weight参数

Android忽略styles.xml中的layout_weight参数,android,android-styles,android-imagebutton,android-layout-weight,Android,Android Styles,Android Imagebutton,Android Layout Weight,看起来android正在忽略ImageButton的布局参数。当我的布局xml使用样式定义ImageButtons时,会考虑布局权重。但是,当我动态添加按钮时,权重被忽略,我必须手动定义LayoutParameters Styles.xml条目: <style name="TabbedPanelToolbarControl" parent="android:style/Widget.ImageButton"> <item name="android:background

看起来android正在忽略ImageButton的布局参数。当我的布局xml使用样式定义ImageButtons时,会考虑布局权重。但是,当我动态添加按钮时,权重被忽略,我必须手动定义LayoutParameters

Styles.xml条目:

<style name="TabbedPanelToolbarControl" parent="android:style/Widget.ImageButton">
    <item name="android:background">@null</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_weight">1.0</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

有人知道在动态添加按钮时强制从styles.xml读取布局权重的方法吗?

在构造函数中读取布局参数不起作用。原因很合理——当您创建
ImageButton

new ImageButton(this.getActivity(), null, R.style.TabbedPanelToolbarControl);
此构造函数将读取样式属性。但是,由于它不在
LinearLayout
(或任何其他父级)内,因此它不知道必须实例化哪个
LayoutParams
类。由于通用的
ViewGroup.LayoutParams
没有
weight
属性,因此它将被忽略

通过
LayoutInflater
充气时,情况完全不同。
LayoutInflater
类中的相关代码如下:

final View view = createViewFromTag(parent, name, attrs);
final ViewGroup viewGroup = (ViewGroup) parent;
final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs);

由于
viewGroup
变量是一个完全创建的
LinearLayout
,因此它有一个覆盖的
generateLayoutParams()
来读取
weight
gravity

,您可以从样式中获取布局参数,然后使用这些参数添加
ImageButton

    ...
    TypedArray a = obtainStyledAttributes(R.style.TabbedPanelToolbarControl, 
            new int[] {android.R.attr.layout_width,
            android.R.attr.layout_height,
            android.R.attr.layout_weight});


    int width = a.getInt(0, LayoutParams.WRAP_CONTENT);
    int height = a.getInt(1, LayoutParams.WRAP_CONTENT);
    float weight = a.getFloat(2, 1);

    mToolbar.addView(ib, new LayoutParams(width, height, weight));

很好,成功了。奇怪的是,没有考虑重量。这可能与ViewGroup没有权重参数,而只有LinearLayout有权重参数有关。@olegr我有类似的问题,样式中不考虑填充底部。我正在加载样式。你知道为什么吗?@Ardoramor尝试使用
ib.setLayoutParams(新的LayoutParams(宽度、高度、重量));mToolbar.addView(ib)它有一点不同的实现。我不确定,但似乎它应该起作用。@Lena Bru奇怪的是,它没有被考虑。不需要额外的努力就可以工作。试着用你的代码示例提问。@olegr我确实问了这个问题,这里是链接
final View view = createViewFromTag(parent, name, attrs);
final ViewGroup viewGroup = (ViewGroup) parent;
final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs);
    ...
    TypedArray a = obtainStyledAttributes(R.style.TabbedPanelToolbarControl, 
            new int[] {android.R.attr.layout_width,
            android.R.attr.layout_height,
            android.R.attr.layout_weight});


    int width = a.getInt(0, LayoutParams.WRAP_CONTENT);
    int height = a.getInt(1, LayoutParams.WRAP_CONTENT);
    float weight = a.getFloat(2, 1);

    mToolbar.addView(ib, new LayoutParams(width, height, weight));