2

看起来 android 忽略了 ImageButton 的布局参数。当我的布局 xml 使用样式定义 ImageButtons 时,会考虑 layout_weight。但是,当我动态添加按钮时,权重会被忽略,我必须手动定义 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>

布局xml:

...
<LinearLayout
    android:id="@+id/toolbar"
    android:orientation="vertical" >
    <!-- image buttons go here -->
</LinearLayout>
...

代码:

View view = inflater.inflate(R.layout.test, container, false);
LinearLayout mToolbar = (LinearLayout)view.findViewById(R.id.toolbar);

ImageButton ib = new ImageButton(this.getActivity(), null, R.style.TabbedPanelToolbarControl);

ib.setImageDrawable(icon);
ib.setContentDescription(title);

// ignored layout_weight defined in TabbedPanelToolbarControl style
mToolbar.addView(ib);
// need to re-specify layout
mToolbar.addView(ib, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1.0f));

任何人都知道在动态添加按钮时强制从 styles.xml 读取 layout_weight 的方法吗?

4

2 回答 2

4

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

new ImageButton(this.getActivity(), null, R.style.TabbedPanelToolbarControl);

此构造函数将读取样式属性。但是,由于它不在 a 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

于 2014-06-13T21:42:16.440 回答
2

您可以从样式中获取布局参数,然后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));
于 2014-06-13T23:07:07.007 回答