1

假设您有一个FrameLayout包含10个LinearLayouts,其中每个时间只有一个可见。可能会改变太多布局的可见性是一个性能问题?

每个LinearLayout是一个复杂的视图,其中包含ButtonEditTextTextView

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:id="@+id/alice 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="visible"> 

     <!-- complex stuff --> 

    </LinearLayout> 

    <!-- many more linear layouts... --> 

    <LinearLayout 
     android:id="@+id/juliett 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="gone"> 

     <!-- last complex stuff --> 

    </LinearLayout> 

</FrameLayout> 

因此:

  1. 改变LinearLayout能见度,为了显示的另一个项目,将是一个巨大的性能问题?
  2. 鉴于这是一个问题,为什么使用ViewFlipper不会降低应用性能?

回答

1

这是不好的做法,因为代码很容易变成一团糟。忽略这一点并仅关注性能,当您将可见性设置为GONE时,视图不会被测量(与INVISIBLE不同)。尽管如此,这个视图占据了一点记忆。根据你在做什么,考虑使用ViewGroup.removeView()

这很难说没有基准,但理论上它不应该有性能问题。

1

这不是一个很好的实现方法,因为每次需要显示另一个视图时,其他视图都必须消失。所以,你会为它编写重复的代码行。 Viewswitcher是更好的选择。那么表演呢?视图切换器将测量所有只能在其内部绘制的儿童视图。这个技巧使视图切换器更快,因为它不需要为其自身重新计算维度,除非您禁用它以使用异构的子视图。

如果你的视图是同质的,最好的方法是实现一个自定义视图并给予一个类改变状态。例如,您将Alice对象设置为您的自定义视图,以显示Alice的属性并将其以编程方式更改为您的业务逻辑。

好运

埃姆雷

+0

onLayout','onMeasure','onRequestFocusInDescendants','onDraw'方法仅在被设置为“View.VISIBLE”的视图上调用(在该序列上),而不是在View中的视图。 GONE'。我知道'Fragment'或'ViewFlipper'是一个_cleaner_解决方案,但我也怀疑是否存在_performance问题_。 –

-1

严重的是,你需要考虑片段的上述情况。 为什么要膨胀不必要的视图。