【问题标题】:Android - How to make child LinearLayout match parent RelativeLayout's heightAndroid - 如何使子 LinearLayout 匹配父 RelativeLayout 的高度
【发布时间】:2015-08-19 18:50:13
【问题描述】:

我将这个 LinearLayout 放在 RelativeLayout 中。

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#66000000"
    android:gravity="center">

    <ImageView
        android:layout_width="30dp"
        android:layout_height="23dp"
        android:src="@drawable/big_tick" />

</LinearLayout>

我想要做的是 - 显示已选择的项目。我设置了 LinearLayout 的高度和宽度 match_parent。它只匹配父级(RelativeLayout)的宽度,而不是高度。

这是我打算做的:

这就是我得到的:

LinearLayout 没有占据其父级的整个高度。

有两个原因,为什么我使用相对布局作为父级:

  1. LinearLayout 应该在正面(应该覆盖)书籍信息中,40% 为黑色

  2. 在书的顶部显示这个符号

整个 XML 如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal">

    <LinearLayout
        android:id="@+id/llBook"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="6dp"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="5dp"
        android:paddingLeft="11dp"
        android:paddingRight="2dp"
        android:paddingTop="8dp">

        <ImageView
            android:id="@+id/ivCover"
            android:layout_width="95dp"
            android:layout_height="146dp" />

        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textColor="#232425"
            android:textSize="12sp" />

        <TextView
            android:id="@+id/tvAuthor"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textColor="#848586"
            android:textSize="10sp" />

    </LinearLayout>

    <ImageView
        android:layout_width="22dp"
        android:layout_height="22dp"
        android:layout_alignRight="@id/llBook"
        android:layout_marginRight="6dp"
        android:background="@drawable/shape_round_book_status"
        android:padding="8dp"
        android:src="@drawable/icon_new" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#66000000"
        android:gravity="center">

        <ImageView
            android:layout_width="30dp"
            android:layout_height="23dp"
            android:src="@drawable/big_tick" />

    </LinearLayout>

</RelativeLayout>

我在 BaseAdapter 类中使用这个 RelativeLayout,我用它来填充 GridView 的项目。

public class LibraryAdapter extends BaseAdapter {

Context context;
RealmResults<RBook> rBooks;
LayoutInflater inflater;

public LibraryAdapter(Context context, RealmResults<RBook> rBooks) {
    this.context = context;
    this.rBooks = rBooks;
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return rBooks.size();
}

@Override
public Object getItem(int position) {
    return rBooks.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    RBook rBook = (RBook) getItem(position);

    View view = convertView;

    if(view == null) {
        // new row is needed to inflate new row
        view = inflater.inflate(R.layout.listitem_library_book, parent, false);
    }

    Bitmap bitmap = BitmapFactory.decodeByteArray(rBook.getCover() , 0, rBook.getCover().length);
    ImageView ivCover = (ImageView) view.findViewById(R.id.ivCover);
    ivCover.setImageBitmap(bitmap);

    TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle);
    tvTitle.setText(rBook.getTitle());

    TextView tvAuthor = (TextView) view.findViewById(R.id.tvAuthor);
    tvAuthor.setText(rBook.getAuthor());

    return view;
}

}


编辑

Try1:正如 cj1098 所建议的,我已将子 LinearLayout 更改为 RelativeLayout。不幸的是,没有效果

Try2:正如挑战者所建议的,我在我的孩子LinearLayout中使用了这个,但效果是这样的:

Try3:按照codeMagic的建议,我改变了子LinearLayout的

gravity="center"

到ImageView的

layout_gravity="center"

结果,LinearLayout 没有占据整个高度。

所以我的问题是如何让子 LinearLayout 匹配父 RelativeLayout 的高度

【问题讨论】:

  • 在您的 RelativeLayout 中,我看到的唯一可绘制对象是 @drawable/icon_new 另一本书的信息是空的,没有图像,没有文本。我不知道您是如何获得屏幕截图的,请在您设置值的地方分享您的代码。也许您在网格或列表视图中设置了不正确的 LayoutParams。 LinearLayout 的match_parent 在这种情况下有效,因为只有一个很小的“新徽章”,并且将“V”图像包裹在里面。
  • @sromku,我已经为我的 BaseAdapter 添加了代码
  • @codeMagic Gravity="center" 指定ImageView居中,我们也可以在ImageView中设置,但是使用layout_gravity
  • @JoeRichard 为了快速获胜,只需将值放在 RelativeLayout 根视图的高度内。喜欢:android:layout_height="200dp" 或任何看起来对你有益的东西。或者,将 root 更改为 FrameLayout 并设置 wrap_content。稍后,我将举例说明如何使其与 RelativeLayout 和 wrap_content 和 onMeasure() 一起使用。但总的来说,问题是 ListView、ViewPager、...中的 RelativeLayout 无法将匹配父级设置为它的行。因此,RelativeLayout 内部视图的 match_parent 不起作用。
  • @JoeRichard 当然不是 :) 您可以更改为 FrameLayout 并通过用 RelativeLayout 包裹它来修复徽章图标位置,然后您就可以恢复动态了。或者如果 RelativeLayout 仅作为根,您将必须为您的布局创建自定义视图并覆盖 onMeasure(),然后将测量的高度设置为您的内部视图。

标签: android android-layout android-linearlayout android-relativelayout


【解决方案1】:

尝试将其添加到 LinearLayout:

    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"

任何方式都可以在不使用 LinearLayout 的情况下使用它(固定可绘制“big_tick”的大小):

    <ImageView
        android:layout_width="30dp"
        android:background="#66000000"
        android:layout_height="23dp"
        android:src="@drawable/big_tick" />

【讨论】:

  • alignParentBottom 和 alignParentTop 在底部制作子 LinearLayout。
  • 关于高度的 fill_parent 而不是 match_parent
  • 尝试RelativeLayout,如果不起作用,添加透明度为66000000的视图,该视图与父级的高度和宽度匹配,并使您的图像视图居中
  • 伙计,只需删除 linearLayout,使用 imageview 刻度作为 centerInParent 并添加一个具有所需透明度的 alignparentBottom 和 alignparentTop 视图,这不是第一次了,android 有很多关于 gridview 的错误。
  • 你会在getView中试试这个吗:(TextView) ((RelativeLayout.LayoutParams)view.findViewById(R.id.imageViewContainerId).getLayoutParams()).height= RelativeLayout.MATCH_PARENT;
【解决方案2】:

我认为单独使用这个布局很好。事实上,您将其放入 ListView 正在造成某种破坏。

但是,您可以强制叠加层将自身 bottomtop 与书籍布局对齐:

android:layout_alignBottom="@id/llBook"
android:layout_alignTop="@id/llBook"

在那之后,也许你还有一些边距需要修复,但上面的两行将使覆盖层与书籍布局一样大。

【讨论】:

    【解决方案3】:

    它占据了其父级的全部高度。摆脱子线性布局上的填充。那么如果这不起作用。将您的 linearLayout 切换到 relativeLayout。 (无论如何更好)另一个限制是您使用的实际图像。他们有不同的高度吗?

    【讨论】:

    • 感谢您的快速回复!但我的问题是关于另一个 LinearLayout.... 将子 LinearLayout 更改为 RelativeLayout 是个好主意!我会试试...
    • 我尝试将子 LinearLayout 更改为 RelativeLayout。不幸的是,没有效果!
    【解决方案4】:

    完全删除 LinearLayout,使用带有 src 'tick' 的 imageview 作为相对布局的直接子级:

    andriod:centerInParent=true
    

    然后添加具有所需背景透明度的视图

    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多