动态创建时,ImageButton的显示方式不同

时间:2017-02-14 23:42:35

标签: android android-layout

我有一个基于GridLayout的视图,我动态添加了几个ImageButton。我试图理解为什么ImageButtons在我从布局xml文件中膨胀时正确设置了样式,但是当我直接使用ImageButton构造函数创建它们时却没有。

GridLayout和ImageButtons以前都在相同的布局.xml文件中定义(并按预期呈现):

<ScrollView 
    style="@style/my_list_style"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="12dp">

        <GridLayout
            android:id="@+id/my_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center">

            <!-- These ImageButtons are being converted to dynamic. --> 
            <ImageButton
                style="@style/my_button_style"
                android:src="@drawable/image1" />

            <ImageButton
                style="@style/my_button_style"
                android:src="@drawable/image2" />

        </GridLayout>
    </LinearLayout>
</ScrollView>

要将ImageButtons转换为动态,我首先将它们从布局文件中删除,并使用如下代码在运行时添加它们:

ImageButton imageButton = new ImageButton(context, null, R.style.my_button_style);
imageButton.setImageResource(R.drawable.image1);
parent.addView(imageButton);

但按钮无法正常渲染;它们没有居中,它们的尺寸似乎不正确/均匀。

然后我尝试创建一个新的布局文件,只包含ImageButton及其样式:

<ImageButton
    style="@style/my_button_style"/>

当我在运行时将此布局扩展到GridView时,一切看起来都符合预期:

LayoutInflater inflater = LayoutInflater.from(context);
ImageButton imageButton = (ImageButton) inflater.inflate(
    R.layout.my_button_layout, parent, false);
imageButton.setImageResource(R.drawable.image1);
parent.addView(imageButton);

为什么使用LayoutInflator对视图进行膨胀会产生与直接从其构造函数创建按钮不同的结果?

1 个答案:

答案 0 :(得分:1)

因为当您手动创建ImageButton时,您没有指定其父级,因此它不知道其父级的布局参数,并且无法按预期布局。

另一方面,当您通过LayoutInflater对其进行充气时,您指定了parent。然后正确的布局参数传递给孩子们。这就是你看到差异的原因。

看看Dave Smith的detailed article