26

我已经使用 GridLayout 几个星期了,我注意到当我打电话时

gridLayout.requestLayout()

它在 LogCat 中吐出以下调试级消息:

D/android.widget.GridLayout(14048): horizontal constraints: x5 - x0 > 1115, x5 - x4 < 221, x4 - x3 < 221, x3 - x2 < 221, x2 - x1 < 221, x1 - x0 < 221 are inconsistent; permanently removing: x5 - x4 < 221. 

我查看了 GridLayout 的源代码,试图找出“约束不一致”的可能原因,但我无法弄清楚。

这些消息正在出现的事实 - 这是我应该关注的事情吗?我认为事情的布置方式没有任何问题。我在 Fragments 中有一个 GridLayout,它作为 ViewPager 中的页面加载,因此当用户在页面之间滚动时,我在 LogCat 中多次看到上述输出。

4

4 回答 4

14

GridLayout来源:

Bellman-Ford 变体 - 修改后将典型运行时间O(N^2)O(N)

GridLayout 将其要求转换为形式的线性约束系统:

x[i] - x[j] < a[k]

其中x[i]是变量,a[k]是常量。

例如,如果变量被标记为x, yz我们可能有:

x - y < 17
y - z < 23
z - x < 42

这是线性规划问题的一个特例,反过来,它等价于有向图上的单源最短路径问题,O(n^2)Bellman-Ford 算法是最常用的通用解决方案。

它有一种solve方法使用线性规划来保证它必须满足的约束的一致性,给定它的配置。如果您找出与约束相关联的配置x5 - x4 < 221并将其删除,您可能会提高布局性能。然后求解器将不必解决它不能满足并自行删除它。

于 2014-01-21T17:17:40.170 回答
5

我有同样的问题,我发现我错过了添加 XML 命名空间。以这种方式更正它:

<android.support.v7.widget.GridLayout 
     xmlns:grid="http://schemas.android.com/apk/res-auto"
     xmlns:android="http://schemas.android.com/apk/res/android">
...
</android.support.v7.widget.GridLayout>

然后也更改了兼容性 GridLayout 使用的属性前缀与 XML 命名空间:

<ImageButton android:id="@+id/btnSentence"
    grid:layout_row="0"
    grid:layout_column="0"
    ...
/>

它有帮助......希望它也能帮助你。

于 2012-05-21T14:47:37.043 回答
2

我通过使用wrap_contentGridLayout 的宽度而不是解决了这个问题match_parent,我想这是它需要担心的一个更少的约束。

于 2019-04-28T16:16:13.643 回答
0

对我来说,我正在使用 GridLayout 创建自定义视图。

问题是我认为我可以在我的 xml 中设置网格的列数。

我的布局 XML 看起来像这样:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"

        app:alignmentMode="alignMargins"
        app:columnCount="9"
        app:columnOrderPreserved="true"
        tools:ignore="HardcodedText"
        app:orientation="horizontal"
        tools:parentTag="androidx.gridlayout.widget.GridLayout"
        app:rowOrderPreserved="true">

        ...

</merge>

不幸的是,它不适用于自定义布局。我必须在命名空间中指定所有这些属性app,在我的自定义视图中,如下所示:

class SimpleCalculatorView(context: Context, attrs: AttributeSet?): GridLayout(context, attrs) {

  init {
    ...

    View.inflate(context, R.layout.view_simple_calculator, this)
    columnCount = 9
    columnOrderPreserved = true
    rowOrderPreserved = true
    orientation = HORIZONTAL
}

执行此操作后,我不再收到错误消息。

编辑

我说得太早了。错误再次出现,这一次,每当我在motionlayout中为自定义布局设置动画时,它就开始发生。

于 2020-06-19T23:34:50.720 回答