我有一个基于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对视图进行膨胀会产生与直接从其构造函数创建按钮不同的结果?
答案 0 :(得分:1)
因为当您手动创建ImageButton
时,您没有指定其父级,因此它不知道其父级的布局参数,并且无法按预期布局。
另一方面,当您通过LayoutInflater
对其进行充气时,您指定了parent
。然后正确的布局参数传递给孩子们。这就是你看到差异的原因。
看看Dave Smith的detailed article。