GridLayout吐出“不一致约束”调试级日志

时间:2012-05-02 20:40:45

标签: android android-layout grid-layout

我已经使用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 个答案:

答案 0 :(得分:13)

来自GridLayout来源:

Bellman-Ford变体 - 经过修改,可将典型的运行时间从O(N^2)减少到O(N)

GridLayout将其需求转换为具有以下形式的线性约束的系统:

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

x[i]是变量而a[k]是常量。

例如,如果变量标记为xyz,我们可能会:

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

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

它有一个solve方法,它使用线性编程来保证它必须满足的约束的一致性,给定它的配置。如果您确定哪个配置与约束x5 - x4 < 221关联并将其删除,则可以提高布局性能。然后解算器将不必解决它无法满足并自行删除它。

答案 1 :(得分: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"
    ...
/>

它帮助了...希望它也能帮到你。

答案 2 :(得分:0)

我通过使用wrap_content作为GridLayout的宽度而不是match_parent来解决了这个问题,我想这是它要担心的一个较少的约束。

答案 3 :(得分: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
}

执行完此操作后,我不再出现错误。

编辑

我讲得太早了。该错误再次出现,并且每次我在动画布局中为自定义布局设置动画时,都会开始发生该错误。