removeView后直接addView仅在新视图包含Button时工作

时间:2017-09-18 17:17:47

标签: android android-layout

我有一个非常奇怪的问题。我先来描述一下观点的结构:

  • MainActivity
    • CoordinatorLayout
      • AppBarLayout
        • CollapsingToolbarLayout
          • FloatingActionButton
          • 工具条
      • NestedScrollView
        • TableLayout
          • TextView(很多)
          • 按钮(可选)

我要做的是根据用户操作将一个NestedScrollView对象替换为另一个。我为此创建了以下方法:

public void switchTableGroup(final TableGroup newTG){
    final NestedScrollView removeNSV = currentNSV;
    Thread switchView = new Thread(){
        public void run(){
            mainCoordinatorLayout.removeView(removeNSV);
            mainCoordinatorLayout.addView(newTG.getNestedScrollView());
        }
    };
    runOnUiThread(switchView);
    this.currentTG = newTG;
    this.currentNSV = newTG.getNestedScrollView();
}

(请注意,TableGroup是我内部数据结构的非图形对象)只要底层TableLayout中至少有一个Button对象,这样就可以正常工作。如果没有Button对象,则删除旧的NestedScrollView,并将新的NestedScrollView写入currentNSV并添加到CoordinatorLayout,但不知何故不可见。有了一些脏代码,这个问题就可以解决了:

  public void switchTableGroupDirty(final TableGroup newTG){
     final NestedScrollView removeNSV = currentNSV;
     Thread switchView = new Thread(){
         public void run(){
             mainCoordinatorLayout.removeView(removeNSV);
             mainCoordinatorLayout.addView(newTG.getNestedScrollView());
         }
     };
     runOnUiThread(switchView);
     this.currentTG = newTG;
     this.currentNSV = newTG.getNestedScrollView();
     Thread doItAgain = new Thread(){
         public void run(){
             mainCoordinatorLayout.removeView(newTG.getNestedScrollView());
             mainCoordinatorLayout.addView(newTG.getNestedScrollView());
         }
     };
     runOnUiThread(doItAgain);
}

我不想依赖两次做某事,是否有一些特定的命令迫使CoordinatorLayout重绘自己?我已经在CoordinatorLayout对象上尝试了invalidate()和refreshDrawableState(),但这没有帮助。还花了很多时间尝试各种组合,睡觉等等。你也可以想象,花了相当长的时间来确定Button的存在是正常方法成功的关键因素......

非常感谢帮助。

0 个答案:

没有答案