Android XML 无法设置展开视图的布局宽度、高度和重量
Unable to set layout width, height and weight of inflated view in XML in Android
我正在开发 Android 应用程序。在我的应用程序中,我需要动态地扩充视图列表。我添加了它们并开始工作。问题在于设置布局的宽度和高度。现在我将用一个简单的项目来演示我的问题。实际上,我的项目比这个简单的项目要复杂得多。
我正在增加此布局的视图。
<LinearLayout
android:orientation="horizontal"
android:id="@+id/cm_photos_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
我正在遍历位图列表并动态添加视图,如下所示
for(Bitmap bmp : bitmaps)
{
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
container.addView(preview);
}
请注意,在上面的代码中,container 是一个 LinearLayout 动态添加到上面的 parent XML。
container = new LinearLayout(this);
container.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
container.setLayoutParams(params);
parentLinearLayout.addView(container);
这是我的item_cm_preview_image.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_weight="1"
android:layout_height="400dp"
android:layout_width="0dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:scaleType="centerCrop"
android:id="@+id/item_cm_preview_image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
如您所见,我在 XML 中将布局高度设置为 400dp,宽度为 0,layout_weight 设置为 1。所以所有图像高度必须相同,宽度必须相等,因为 layout_weight。但结果并不如预期。您可以在下面查看屏幕截图。
如您在屏幕截图中所见,layout_weight 和高度均不适用于所有膨胀视图。但是,如果我动态添加额外的 ViewGroup 并将视图扩展到该布局,它就可以工作。下面是我的代码
//This happening in for loop
LinearLayout wrapper = new LinearLayout(this);
wrapper.setLayoutParams(new LinearLayout.LayoutParams(0,500,1));
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
wrapper.addView(preview);
container.addView(wrapper);
这是结果:
如您所见,当我使用额外的动态线性布局时,layout_weight 和高度都有效。为什么在 XML 中设置布局重量和高度不起作用?为什么第二种方式有效?如何在 XML 布局文件中设置重量和高度?可能吗?
如果您使用
方法扩充布局
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
它跳过它的宽度和高度参数...,但如果您将使用:
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,parent,false);
它应该可以正常工作,例如,如果您将 activity 中的视图膨胀为父视图,您可以提供 (ViewGroup) getView():
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,(ViewGroup) getView(), false);
我正在开发 Android 应用程序。在我的应用程序中,我需要动态地扩充视图列表。我添加了它们并开始工作。问题在于设置布局的宽度和高度。现在我将用一个简单的项目来演示我的问题。实际上,我的项目比这个简单的项目要复杂得多。
我正在增加此布局的视图。
<LinearLayout
android:orientation="horizontal"
android:id="@+id/cm_photos_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
我正在遍历位图列表并动态添加视图,如下所示
for(Bitmap bmp : bitmaps)
{
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
container.addView(preview);
}
请注意,在上面的代码中,container 是一个 LinearLayout 动态添加到上面的 parent XML。
container = new LinearLayout(this);
container.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
container.setLayoutParams(params);
parentLinearLayout.addView(container);
这是我的item_cm_preview_image.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_weight="1"
android:layout_height="400dp"
android:layout_width="0dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:scaleType="centerCrop"
android:id="@+id/item_cm_preview_image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
如您所见,我在 XML 中将布局高度设置为 400dp,宽度为 0,layout_weight 设置为 1。所以所有图像高度必须相同,宽度必须相等,因为 layout_weight。但结果并不如预期。您可以在下面查看屏幕截图。
如您在屏幕截图中所见,layout_weight 和高度均不适用于所有膨胀视图。但是,如果我动态添加额外的 ViewGroup 并将视图扩展到该布局,它就可以工作。下面是我的代码
//This happening in for loop
LinearLayout wrapper = new LinearLayout(this);
wrapper.setLayoutParams(new LinearLayout.LayoutParams(0,500,1));
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
wrapper.addView(preview);
container.addView(wrapper);
这是结果:
如您所见,当我使用额外的动态线性布局时,layout_weight 和高度都有效。为什么在 XML 中设置布局重量和高度不起作用?为什么第二种方式有效?如何在 XML 布局文件中设置重量和高度?可能吗?
如果您使用
方法扩充布局View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
它跳过它的宽度和高度参数...,但如果您将使用:
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,parent,false);
它应该可以正常工作,例如,如果您将 activity 中的视图膨胀为父视图,您可以提供 (ViewGroup) getView():
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,(ViewGroup) getView(), false);