根据其内容设置RelativeLayout的高度

时间:2014-08-05 22:09:23

标签: android android-layout listview

我有一个RelativeLayout项目,其中包含一个图片及其右侧(从上到下)5 ListView和一个按钮:

TextViews

图像的宽度是固定的,其高度是未知的,所以我想要的是图像的高度等于其他5个视图的高度(如上例所示)。

我尝试在 ------- textView | | textView | | textView | | textView | | textView ------- button xml中这样做,但我似乎无法做到这一点。 我得到的最好的是在适配器的list_item函数中设置视图的高度,但我正在为列表中的每个项目执行此操作,这看起来很浪费。

有没有办法在xml文件中设置它? 我可以在xml中将高度设置为“0dp”,并且只在代码中设置一次(而不是getView中的每个项目)?

由于

3 个答案:

答案 0 :(得分:0)

设置RelativeLayout的高度也是wrap_content应该做的工作,相同的图像高度

答案 1 :(得分:0)

这是一段对我有用的代码:

<强> MainActivity.java:

package com.example.simon.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

    private final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RelativeLayout rLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
        final ImageView imageView = (ImageView) findViewById(R.id.imageView);

        // Delay the image, so textViews are created and ready for measure
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                imageView.setMaxHeight(rLayout.getMeasuredHeight());
                imageView.setImageResource(R.drawable.image);
            }
        }, 100);
    }

}

<强>布局/ activity_main.xml中:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity">


    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:contentDescription="hello"/>

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_toRightOf="@id/imageView"/>
    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_below="@+id/tv1"
        android:layout_toRightOf="@id/imageView"/>
    <TextView
        android:id="@+id/tv3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_below="@+id/tv2"
        android:layout_toRightOf="@id/imageView"/>
    <TextView
        android:id="@+id/tv4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_below="@+id/tv3"
        android:layout_toRightOf="@id/imageView"/>
    <TextView
        android:id="@+id/tv5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_below="@+id/tv4"
        android:layout_toRightOf="@id/imageView"/>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there"
        android:layout_below="@+id/tv5"
        android:layout_toRightOf="@id/imageView"/>


</RelativeLayout>

请注意缩放图片的scaleCropadjustViewBounds,以便设置maxHeight。

另请注意,您需要花一些时间来创建RelativeLayout的其他元素,以便对其进行衡量。

答案 2 :(得分:0)

由于在第二个活动中需要膨胀的项目,我决定在第一个活动中膨胀布局并将其高度设置为该活动的公共静态成员,以供第二个活动读取。 / p>

我最终等待布局完成充气,保存高度,并在显示之前将其可见性设置为GONE。

public static int listItemLayoutHeight;
...
protected void onCreate(Bundle savedInstanceState) {
    final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.dummyListItemLayout);
    relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            relativeLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            listItemLayoutHeight = relativeLayout.getHeight();
            relativeLayout.setVisibility(View.GONE);
        }
    });
    ...
}
BTW,另一种选择可能是将此布局放在FrameLayout中,并用主布局覆盖它。

感谢您的帮助:)