0

我想在 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中的单个item,所以我假设父级是gridview?如果是这样,我不确定宽度大是否正常,因为它是在 wrap_content 上配置的,但如果 Android 创建具有特定大小的对话框,即使使用 wrap_content 也可能是正常的。

任何人都知道如何使用 wrap_content 而不是固定大小?

4

2 回答 2

1

首先,感谢 Andy Harris 和 Dipak Keshariya 的帮助。它并没有完全解决问题,但它帮助我理解 android:layout_weight="0" 会导致问题。

在我在这里发布我的答案之前,我已经尝试过配置

android:layout_weight="1"

仅适用于图像视图,但这不起作用。将两者都设置为 1,确实使 ImageView 可见,但是,它没有正确显示。imageview 的大小似乎是正确的,但它显示了图像的一部分(所以放大了)。

我尝试使用 ImageView.ScaleType 和 AdjustViewBounds,但没有任何效果。

如果我配置

android:layout_weight="1"

仅对于 GridView,它会正确显示 GridView 和 ImageView,但在这种情况下,gridview 会占用所有相应的宽度,这使得对话框的宽度与平板电脑的屏幕一样(将 parentview 的宽度更改为 match_parent 不会不要改变它)。

所以我现在将继续使用固定大小。

谢谢您的帮助!

于 2012-08-19T15:13:46.537 回答
0

在 GridView 和 ImageView 中,使用:

android:layout_width="0dp"
android:layout_weight="1"

这应该解决它。如果您希望一个视图比另一个占用更多的可用屏幕空间,您可以尝试为每个视图使用不同的权重。

于 2012-08-16T01:56:28.293 回答