强制重新布线LinearLayout

时间:2016-05-03 17:18:52

标签: android android-layout

我的情况是显示回收的视图,但我认为由于Android中的一些优化,它们不会重新布局。

许多帖子建议在回收的视图上调用view.layout(),我怀疑它会起作用。然而,它也意味着设置我自己的LayoutParams,虽然我很确定我可以让它工作,但我并没有真正掌握所有可用的信息,在那里重新开发的视图可以正确地进行。< / p>

此问题可能是嵌套LinearLayouts所特有的。当我运行测试时,通过折叠到单个LinearLayout,问题就消失了。

这是布局的简化版本,但失败了。在此示例中,将调用外部LinearLayout的onLayout()。如果调用内部布局的onLayout(),我不知道(没有更多的实验)。不会调用TextView的onLayout,也不会调用“其他内容”。

更新:未调用内部布局的onLayout()。

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/node"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical" >

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
      android:id="@+id/note"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1" />

    ... more stuff ...
  </LinearLayout>

  ... more stuff ...

</LinearLayout >

哦,我应该提一下,这似乎只发生在运行Android API 19的设备上。

我希望有一种“正确”的方式来强制Android在其级别重新布局TextView和其他小部件。

1 个答案:

答案 0 :(得分:0)

我发现了成员函数forceLayout(),我在下面的递归函数中使用了它。它似乎没有给我的应用程序添加任何重要的运行时开销。

  public static void forceLayoutAndroid19 (ViewGroup vg)
  {
    if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.KITKAT)
    {
      for (int i = 0, limit = vg.getChildCount ();  i < limit;  i++)
      {
        View child = vg.getChildAt (i);
        child.forceLayout ();
        if (child instanceof ViewGroup)
          forceLayoutAndroid19 ((ViewGroup)child);
      }
    }
  }