Android性能:以编程方式添加视图,而不是将视图设置为GONE/VISIBLE

Android性能:以编程方式添加视图,而不是将视图设置为GONE/VISIBLE,android,performance,android-layout,android-view,Android,Performance,Android Layout,Android View,我在一个项目中工作,当用户第一次打开应用程序时,需要膨胀一个简单的教程视图。我正试图用“正确的方式”来做这件事,我想知道性能问题 目前,我的布局中有一个视图设置为android:visibility=“GONE”,根据共享的引用,我将其更改为VISIBLE。这让我可以让用户了解应用程序在首次启动时是如何工作的 我想知道的是,当视图在我的片段中呈现时,它意味着什么。我的猜测是,视图将被无用地膨胀,即使其可见性设置为消失 现在,我在考虑另一种选择:如果我只在第一次启动时添加视图,但以编程方式,在片段

我在一个项目中工作,当用户第一次打开应用程序时,需要膨胀一个简单的教程视图。我正试图用“正确的方式”来做这件事,我想知道性能问题

目前,我的布局中有一个视图设置为
android:visibility=“GONE”
,根据共享的引用,我将其更改为
VISIBLE
。这让我可以让用户了解应用程序在首次启动时是如何工作的

我想知道的是,当视图在我的片段中呈现时,它意味着什么。我的猜测是,视图将被无用地膨胀,即使其可见性设置为
消失


现在,我在考虑另一种选择:如果我只在第一次启动时添加视图,但以编程方式,在片段的
onCreateView
中添加视图,该怎么办。这应该允许视图在以后的发布中不会膨胀,但以编程方式膨胀视图不会意味着在第一次发布时性能不好吗?

我想我只是偶然发现了您性能问题的答案

从:

对于正在淡入的视图,将其可见性设置为“消失”。这 防止视图占用布局空间,并将其从布局中忽略 计算,加快处理速度。


这意味着性能不会受到影响,只要您不将
android:visibility
设置为除
GONE

之外的任何内容,那么,为了回答我自己的问题,我使用DDMS工具
TraceView
监视来自我的片段
onAttach
的调用,直到它的
onResume
。它让我看到哪些实现效率较低

为了进行测试,我有一个简单的
RelativeLayout
,里面有一个
FrameLayout
(一直显示)。每次添加时,我都使用自定义布局,可以是编程方式,也可以是在布局文件中显示GONE。自定义布局由一个带有4个子项的RelativeLayout(一个ImageView、一个TextView、一个View和一个按钮)组成

我的
onCreateView
如下所示,允许应用程序基于两个
静态最终布尔值
常量膨胀正确的布局,以更改布局

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    LinearLayout root;
    if(INFLATE_PROGRAMMATICALY) {
        root = (LinearLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false);
        if(SHOULD_FYI_VIEW_BE_SHOWN) {
            View tutoView = inflater.inflate(R.layout.inner_view, root, false);
            root.addView(tutoView);
        }
    } else {
        root = (LinearLayout) inflater.inflate(R.layout.fragment_test_gone,container,false);
        if(SHOULD_FYI_VIEW_BE_SHOWN) {
            View tutoView = root.findViewById(R.id.RL_inner_view);
            tutoView.setVisibility(View.VISIBLE);
        }
    }
    return root;
}
这将导致以下结果:

当可选布局处于充气状态时

是否显示视图=true

TraceView给出的最大“实时估计”值为75ms,当视图从
已消失
更改为
可见
,但当我们需要实例化
内部视图
时为110ms

当可选布局未充气时
是否应显示视图=false

在这种情况下,TraceView给出的
GONE
视图膨胀的最大实时估计值为102ms,而当膨胀的视图没有
GONE
视图时,最大实时估计值为39ms

因此,为了在视图不需要膨胀的情况下提高性能,我认为最好的解决方案是以编程方式膨胀视图(如果只需要显示几次)


你可以在一台电脑上找到这个测试项目,我想你是在重新发明一个轮子。对于这个场景,Android xml布局中已经存在了一个工具。它被称为ViewStub。您可以在此处阅读更多内容:

不确定性能比较。但如果它真的像第一次运行时的教程,那么试试:)@PurpleDroid好吧,我现在实际上是将它显示为一个
cardwiew
。这只是第一次使用的参考资料,不是真正的教程!:-)@玛奇米奇:对不起,我得问你“你试过什么?”。使用诸如DDMS之类的工具很容易跟踪使用logcat的应用程序的进度。为什么你不自己尝试一下不同的方法,看看会发生什么?@Squonk嗯,我还没有真正有机会玩android调试工具和DDM。我想可能有人知道这个平台是如何工作的,但你是对的,我一定要试试。我现在就尝试这样做,当我发现有价值的东西时,我会更新这个帖子
TraceView
实际上可能会起作用。