我已经使用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中多次看到上面输出的页面之间滚动时。
答案 0 :(得分:13)
来自GridLayout
来源:
Bellman-Ford变体 - 经过修改,可将典型的运行时间从O(N^2)
减少到O(N)
GridLayout将其需求转换为具有以下形式的线性约束的系统:
x[i] - x[j] < a[k]
x[i]
是变量而a[k]
是常量。
例如,如果变量标记为x
,y
,z
,我们可能会:
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
}
执行完此操作后,我不再出现错误。
编辑
我讲得太早了。该错误再次出现,并且每次我在动画布局中为自定义布局设置动画时,都会开始发生该错误。