【问题标题】:Getting child view to match_parent in Android在Android中将子视图获取到match_parent
【发布时间】:2017-01-09 22:37:39
【问题描述】:

我有一个简单的线性布局,我在适配器中充气:

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

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.category_listview_row, parent, false);
        } else {
            ((LinearLayout)convertView).removeAllViews();
        }

        if (LAYOUT_TYPES.GRID.equals(layoutType)) {
            convertView = CategoryFragment.getViewForGridLayout(context, displayArray, position, convertView, listener);
        } else {
            convertView = CategoryFragment.getViewForListLayout(context, displayArray, position, convertView, listener);
        }

        return convertView;
    }

这里,category_listview_row 如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:gravity="top"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

getViewForGridLayout 方法以编程方式创建一个或多个视图并将它们添加到convertView

我希望所有子视图的高度都与这个父视图相匹配,但是我无法让它工作。这是以编程方式添加的子视图的外部线性布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/base_listview_style_one_layout"
    android:orientation="horizontal"
    android:padding="@dimen/node_default_spacing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:background="#5ab9c6">

此布局有子视图,这些子视图会根据要显示的实际数据被删除,因此有些会比其他的要长。但是我希望它们都是父级的高度,所以它看起来并不奇怪。

这是我看到的截图:

  • 第一行没问题,因为两个项目都有标题和子文本
  • 在第二行,第二个项目没有潜台词,因此视图更小。但是,我希望它占据行的全部高度,这样一行中的所有项目都将具有相同的高度。

有什么建议吗?谢谢!

【问题讨论】:

  • 对我来说看起来像一些水平滚动条。不确定您的问题是什么,但我看到 LinearLayout 子视图的 android:layout_width 可能应该是 wrap_content。
  • “但是我不能让它工作”——你看到了什么?实际高度不正确的实际视图是什么?当你使用 Android Studio 的 Layout Inspector 来检查这些东西时,它会告诉你什么? “这是以编程方式添加的子视图的外部线性布局”——您的背景颜色是否具有正确的高度?
  • @CommonsWare 我添加了一个屏幕截图来更好地描述我所看到的。谢谢
  • 如果您使用实际设置的东西来实现网格(例如,RecyclerViewGridLayoutManager),而不是试图用 LinearLayout 伪造它,您可能会更轻松。否则,我只能建议使用 Android Studio 的 LayoutInspector 来尝试确定为什么您的规则没有按预期工作。
  • 如果我没记错的话,我尝试使用 RecyclerViewGridLayoutManager 但能够有一些行有 2 个项目,而其他行有 1 个项目(并且填满整行)是不直截了当。我会重新阅读GridLayoutManager 文档。

标签: android android-layout android-linearlayout


【解决方案1】:

我建议使用带有 GridLayoutManager 的 Recyclerview。

如果您希望某些项目跨越多列,您可以通过在 GridLayoutManager 上设置 SpanSizeLookup 来实现。

这是一个简单的例子https://stackoverflow.com/a/26907508/4498224

【讨论】:

    【解决方案2】:

    可能您的布局参数被忽略。确保您将子视图添加到您的 convertView 中,如下所示:

    View view = inflater.inflate( R.layout.item /* resource id */,
                                         convertView /* parent */,
                                         true /*attachToRoot, you dont need to call addView then*/);
    

    【讨论】:

      【解决方案3】:

      为什么不删除文本视图,而不是让它不可见或将其颜色设置为白色以占用空间?

      【讨论】:

      • 如果两张卡片都没有潜台词怎么办?会有不必要的空白。
      【解决方案4】:

      请将您的线性布局高度从环绕内容更改为“match_parent”。

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal"
          android:gravity="top"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />`
      

      【讨论】:

        【解决方案5】:
        1. 将父布局的高度设置为wrap_content。
        2. 将子视图的高度设置为匹配父视图。

        试试这个,希望它能解决你的问题。

        【讨论】:

          【解决方案6】:

          @zundi 您可以将视图持有者设计模式与回收器视图适配器一起使用,并定义哪一行需要有两个图像,哪一个需要有一个。它比使用线性布局要简单得多。

          Recycleview show different view types 对如何做到这一点有相当不错的解释。

          同时也回答你制作的问题

          一些行有 2 个项目,而其他行有 1 个项目

          您可以使用GridLayoutManager的setSpanSizeLookup(GridLayoutManager.SpanSizeLookup spanSizeLookup)方法并在activity中定义。

          RecycleView's span size 为您提供有关如何实现这一目标的更多信息。

          mLayoutManager.setSpanSizeLookUp(new GridLayoutManager.SpanSizeLookUp() {
               @Override
               public int getSpanSize(int position) {
                   if(position == 0) 
                      return 2; //here the view takes up two spaces in a row(header)
                   else return 1; //here view takes 1 space i.e., 2 views in a total row
              } });
          

          在上面的示例中,我的网格布局管理器根据不同的位置获取 2 个视图持有者,并决定是否其标题并填充数据。

          其他解决方案:

          而不是在布局中提供匹配父级和包装父级,而是为高度提供一个固定的“dp”。这应该使视图看起来一致。

          【讨论】:

            【解决方案7】:

            @zundi 如果使用 RecyclerView 和 LayoutManager 以正确的方式进行操作,这将大大简化您的生活,但有一点学习曲线不适合您,这里有一个尚未提及的选项:

            您可以在包含子文本的 TextView 上定义 android:lines=x。

            仅 match_parent 对您不起作用,因为您希望 LinearLayout 将其子项及其子项的高度包装为 match_parent,这是一个循环依赖项

            【讨论】:

              【解决方案8】:

              这个方法可以在你使用的 Linear Layout 或 TextView 上执行

              你已经设置了

              android:layout_height="match_parent"

              但不是高度,所以是简单的情况

              android:layout_height="match_parent"

              所以,即使字符串中没有值,它仍然会包含分配给它的高度

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-12-19
                • 2012-01-13
                • 2012-12-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-06
                相关资源
                最近更新 更多