没有源的ImageView不尊重布局,添加源不修复布局

时间:2013-04-25 15:49:18

标签: android imageview

我的基本布局是LinearLayouts的ListView,网格中的每个项目都是下面的FrameLayout。我正在将图像下载到ImageView。在加载图像之前,没有内容,并且布局缩小到小ProgressBar(第一个问题)的高度,当我期望它是240dp或120dp时。将图像放置在视图中后,布局不会调整(第二个问题),高度仍然是小型ProgressBar的缩小尺寸。

加载图片代码:

@Override
public View getView(View convertView) {
    // ...
    // set up holder
    // ...
    new GetPhotoTask().execute(holder.my_tile_image, holder.my_loading, my_media_url);
    holder.my_tile_image.setVisibility(View.INVISIBLE);
    holder.my_loading.setVisibility(View.VISIBLE);
    holder.my_tile_label.setText(activityObject1.track.name);
    // ...
}


private final class GetPhotoTask extends AsyncTask<Object, Void, Drawable> {

    ImageView iv;
    ProgressBar pb;

    @Override
    protected Drawable doInBackground(Object... params) {
        iv = (ImageView) params[0];
        pb = (ProgressBar) params[1];
        return new BitmapDrawable(getResources(), loadAsset(params[2]).media_url, true));
    }

    @Override
    protected void onPostExecute(Drawable result) {
        super.onPostExecute(result);
        pb.setVisibility(View.GONE);
        iv.setImageDrawable(result);
        iv.setVisibility(View.VISIBLE);
    }
}

主xml:

<ListView
        android:id="@+id/my_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="2dp" />

每行的xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_row_type_3"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:weightSum="3" >
    <include layout="@layout/my_tile_layout"
        android:id="@+id/my_tile_1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />
    <LinearLayout
        android:id="@+id/my_row_type_2"
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:weightSum="2" >
        <include layout="@layout/my_tile_layout"
            android:id="@+id/my_tile_2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
        <include layout="@layout/my_tile_layout"
            android:id="@+id/my_tile_3"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>
</LinearLayout>

行内容的xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_tile_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="2dp" >
    <ImageView
        android:id="@+id/my_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:contentDescription="@string/foo" />
    <ProgressBar
        android:id="@+id/my_loading"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />
    <TextView
        android:id="@+id/my_tile_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/my_title"
        android:layout_gravity="left|bottom" />
</FrameLayout>

为什么初始布局缩小到进度条的高度,即使我为每行硬编码240dp?为什么在ImageView内容中设置位图不会导致它在此时调整大小?第一个问题是最重要的,因为我相信它会使第二个问题无效。提前谢谢。

为了获得我想要的结构,我使用RelativeLayout作为图块(用于分层能力),并且对于每一行,我重写LinearLayout以强制执行我想为每一行设置的大小。由于每个磁贴的内容可能比视图更大或更小,这使我无法依赖centerCrop或fitCenter。因此,在我的自定义布局中,我将高度设置为与每行的宽度成比例,并将MeasureSpec的模式设置为完全。

public final class MyRow3 extends LinearLayout { 
// ... 
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, makeMeasureSpec(getSize(widthMeasureSpec) * 2 / 3, MeasureSpec.EXACTLY));
}

2 个答案:

答案 0 :(得分:0)

我不确定为什么它不尊重它,但为什么不做这样的事情呢?

在ImageView中设置绝对高度以保证一些空间。

<ImageView
    android:layout_height="###dp"
/>

然后在加载图像之前将布局更改回自动调整状态:

iv.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT ) );

答案 1 :(得分:0)

为了获得我想要的结构,我使用RelativeLayout作为图块(用于分层能力),并且对于每一行,我重写LinearLayout以强制执行我想为每一行设置的大小。由于每个磁贴的内容可能比视图更大或更小,这使我无法依赖centerCrop或fitCenter。因此,在我的自定义布局中,我将高度设置为与每行的宽度成比例,并将MeasureSpec的模式设置为完全。

public final class MyRow3 extends LinearLayout { 
// ... 
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, makeMeasureSpec(getSize(widthMeasureSpec) * 2 / 3, MeasureSpec.EXACTLY));
}