我想在Android中用2个组件创建一个DialogFragment: 左侧的GridView带有图像,右侧有一个大图像(这是gridview中所选图像的较大版本)。
问题在于我无法看到我的大图像。似乎GridView占据了所有空间。
这是我的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="horizontal"
android:background="#FFFFFF">
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image_overview"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:columnWidth="50dp"
android:numColumns="1"
android:gravity="left"
android:background="#FFFFFF"
/>
<ImageView
android:id="@+id/main_image"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:background="#FFFFFF"
/>
</LinearLayout>
我已经尝试了很多参数来看看它是否有任何区别,但没有任何帮助。我的gridview很小(因为我放了一个小尺寸),但是右边的空格是空的。
如果删除gridview,我可以看到大图。 如果我为gridview设置了特定的宽度,我也可以看到我的大图。
因此,如果我更改GridView的以下行
android:layout_width="wrap_content"
通过
android:layout_width="100dp"
它按预期工作。 看起来wrap_content设置了更大的宽度。
这是创建我的topvew的代码(一些代码是注释,因为我尝试了一些东西,看它是否有任何影响):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().setTitle("Title Item");
//Get complete View
topView = inflater.inflate(R.layout.something, container, false);
imageAdapter = new ImageAdapter(this.getDialog().getContext());
//Create the left panel (gridview of small images)
GridView gridview = (GridView)topView.findViewById(R.id.image_overview);
gridview.setAdapter(imageAdapter);
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
currentBigImage = imageAdapter.getFilePath(position);
updateMainImage();
}
});
//gridview.setAdjustViewBounds(true);
//Create the middle panel (big image)
imageView = (ImageView)topView.findViewById(R.id.main_image);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
//imageView.setAdjustViewBounds(true);
//imageView.setPadding(8, 8, 8, 8);
updateMainImage();
//v.invalidate();
return topView;
}
这是我的适配器的代码(为小图片创建一个视图):
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(50, 50));
//imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageBitmap(BitmapFactory.decodeFile(paths.get(position)));
Log.i("parent.getWidth(): ", ""+parent.getWidth());
return imageView;
}
正如你所看到的,我也打印父母的宽度,这是一个非常大的数字。因为这里的视图是gridview中的单个项目,我假设父视图是gridview?如果是这样,我不确定宽度是否正常,因为它是在wrap_content上配置的,但如果Android创建了一个具有特定大小的对话框,那么即使使用wrap_content也可能正常。
任何人都知道如何使用wrap_content而不是固定大小?
答案 0 :(得分:1)
首先,感谢Andy Harris&amp; Dipak Keshariya的帮助。它没有完全解决问题,但它帮助我理解android:layout_weight =“0”可能导致问题。
在我发布答案之前,我已经尝试配置
android:layout_weight="1"
仅适用于imageview,但不起作用。 将它设置为1,确实使ImageView可见,但是,它没有正确显示。图像视图的大小似乎是正确的,但是显示大图像的一部分(如此放大)。
我尝试使用ImageView.ScaleType和AdjustViewBounds,但没有任何效果。
如果我配置
android:layout_weight="1"
仅适用于GridView,它正确显示GridView和ImageView,但在这种情况下,gridview占用所有相应的宽度,这使得对话框的宽度与平板电脑的屏幕一样(更改父视图的宽度) to match_parent不会改变它。)
所以我现在继续使用固定大小。
感谢您的帮助!
答案 1 :(得分:0)
在GridView和ImageView中,使用:
android:layout_width="0dp"
android:layout_weight="1"
这应该解决它。如果您希望一个视图占用更多可用屏幕空间而不是另一个视图,则可以尝试为每个视图使用不同的权重。