27

I've been using GridLayout for a few weeks now and I've noticed that when I call

gridLayout.requestLayout()

it spits out the following debug-level message in 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. 

I've looked through the source of GridLayout to try and find out the possible reason as to why the "contraints are inconsistent", but I haven't been able to figure it out.

The fact that these messages are appearing - is this something that I should be concerned about? I don't see any issues with the way things are being laid out. I have a GridLayout in Fragments that are loaded as the pages in a ViewPager so I as the user scrolls between the pages I see the above output in LogCat multiple times.

mdupls
  • 2,012
  • 1
  • 27
  • 40
  • Hope it will be helpful you https://stackoverflow.com/questions/37997670/gridlayout-vertical-horizontal-constraints-are-inconsistent?noredirect=1&lq=1 – Naresh Palle Oct 17 '17 at 11:28

4 Answers4

14

From the GridLayout source:

Bellman-Ford variant - modified to reduce typical running time from O(N^2) to O(N)

GridLayout converts its requirements into a system of linear constraints of the form:

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

Where the x[i] are variables and the a[k] are constants.

For example, if the variables were instead labeled x, y, z we might have:

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

This is a special case of the Linear Programming problem that is, in turn, equivalent to the single-source shortest paths problem on a digraph, for which the O(n^2) Bellman-Ford algorithm the most commonly used general solution.

It has a solve method that is using linear programming to guarantee the consistency of the constraints it has to satisfy, given its configuration. You can probably improve your layout performance if you figure out which configuration is associated with the constraint x5 - x4 < 221 and remove it. Then the solver won't have to solve that it can't be satisfied and remove it itself.

Ahmad
  • 69,608
  • 17
  • 111
  • 137
Dandre Allison
  • 5,975
  • 5
  • 42
  • 56
5

I had the same issue and I found that I missed to add XML namespace. Corrected it in this way:

<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>

Then changed prefix of attributes used by compatibility GridLayout with XML namespace too:

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

and it helped... Hope it helps you too.

Tomáš Hubálek
  • 1,162
  • 1
  • 10
  • 28
  • I tried this and still seem to have the same problem. I'm not using the compatibility library - this might be the difference. Thanks. – mdupls May 23 '12 at 12:05
2

I made the issue go away by using wrap_content for the GridLayout's width instead of match_parent, I guess it is one less constraint for it to worry about.

Daniel Wilson
  • 18,838
  • 12
  • 85
  • 135
0

For me I was creating a custom view using GridLayout.

The problem was that I thought I could set the grid's column count inside my xml.

I had layout XML that looked like this:

<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>

Unfortunately it does not work this way for custom layouts. I had to specify all those attributes in namespace app, in my custom view like this:

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
}

After doing this, I no longer got the error.

EDIT

I spoke too soon. The error came back again and this time it started happening whenever I animate the custom layout in a motionlayout.

smac89
  • 39,374
  • 15
  • 132
  • 179