RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1147988
Accepted
Sergei Buvaka
Sergei Buvaka
Asked:2020-07-02 05:10:23 +0000 UTC2020-07-02 05:10:23 +0000 UTC 2020-07-02 05:10:23 +0000 UTC

LayoutManage: getDecoratedMeasuredHeight(view) 总是返回 0

  • 772

我正在写 custom LayoutManager。有这样的方法

override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) {
        detachAndScrapAttachedViews(recycler)
        fillRecycler(state, recycler)
    }

private fun fillRecycler(
        state: RecyclerView.State,
        recycler: RecyclerView.Recycler
    ) {
        for (position in 0 until state.itemCount) {
            val spanInfo = spanProvider.getSpanOnPosition(position)
            val coordinates = matrix.add(Matrix.Point(spanInfo.column, spanInfo.row))

            val view: View = recycler.getViewForPosition(position)

            val cellWidth = (width - paddingStart - paddingEnd) / spanCount
            val cellHeight = if (isSquareCell) cellWidth
                             else getDecoratedMeasuredHeight(view) //todo вот здесь всегда 0

            val top = paddingTop + cellHeight * coordinates.top
            val bottom = paddingBottom + cellHeight * coordinates.bottom
            val left = paddingLeft + cellWidth * coordinates.left
            val right = paddingRight + cellWidth * coordinates.right

            measureChildWithDecorationsAndMargin(view, right - left, bottom - top)

            addView(view, position)
            layoutDecorated(view, left, top, right, bottom)
            checkLowestView(view, bottom, right)
        }
    }

问题是 getDecoratedMeasuredHeight(view) 方法总是返回 0。我尝试自己打开它View并从那里获取LayoutParams高度 0。它getDecoratedMeasuredWidth(view)返回正确的值。

这是布局本身:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/spanItem"
    android:padding="16dp"
    android:layout_gravity="center"
    android:layout_width="200dp"
    android:layout_height="200dp">

    <TextView
        android:background="@android:color/transparent"
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="22sp"
        tools:text="Test" />
</FrameLayout>

这是方法generateDefaultLayoutParams():

override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams =
        RecyclerView.LayoutParams(
            RecyclerView.LayoutParams.WRAP_CONTENT,
            RecyclerView.LayoutParams.WRAP_CONTENT
        )

以下是测量儿童的两种方法View:

private fun measureChildWithDecorationsAndMargin(
        child: View,
        cellWidth: Int,
        cellHeight: Int
    ) {
        var widthSpec = View.MeasureSpec.makeMeasureSpec(cellWidth, View.MeasureSpec.EXACTLY)
        var heightSpec = View.MeasureSpec.makeMeasureSpec(cellHeight, View.MeasureSpec.EXACTLY)

        val decorRect = Rect()
        calculateItemDecorationsForChild(child, decorRect)
        val params = child.layoutParams as RecyclerView.LayoutParams
        widthSpec = updateSpecWithExtra(
            widthSpec, params.leftMargin + decorRect.left,
            params.rightMargin + decorRect.right
        )
        heightSpec = updateSpecWithExtra(
            heightSpec, params.topMargin + decorRect.top,
            params.bottomMargin + decorRect.bottom
        )
        child.measure(widthSpec, heightSpec)
    }

    private fun updateSpecWithExtra(spec: Int, startInset: Int, endInset: Int): Int {
        if (startInset == 0 && endInset == 0) return spec

        val mode = View.MeasureSpec.getMode(spec)
        return if (mode == View.MeasureSpec.AT_MOST || mode == View.MeasureSpec.EXACTLY) {
            View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.getSize(spec) - startInset - endInset, mode)
        } else spec
    }

如果有人告诉我为什么会发生这种情况以及如何解决它,我会很高兴。

android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Sergei Buvaka
    2020-07-02T12:26:13Z2020-07-02T12:26:13Z

    问题是在通话时

    getDecoratedMeasuredHeight(view)
    

    收到View的还没有测量。我用自定义方法做到了measureChildWithDecorationsAndMargin()。因此,它没有尺寸。添加对标准方法的调用

     measureChildWithMargins(view, 0, 0)
    

    在打电话之前getDecoratedMeasuredHeight(view)解决了我的问题。

    • 0

相关问题

  • 来自片段的列表落后于 BottomNavigationView

  • 无法将变量从 Activity 传递到 Fragment

  • 构建与完成的片段略有不同的片段的最佳方法是什么?

  • 如何更改来自服务器的响应中的日期格式?

  • 谷歌地图在应用程序的发布版本中不起作用

  • 材料设计按钮。单击按钮上的可选区域!

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5