【发布时间】: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 没有占据其父级的整个高度。
有两个原因,为什么我使用相对布局作为父级:
LinearLayout 应该在正面(应该覆盖)书籍信息中,40% 为黑色
在书的顶部显示这个符号
整个 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