1

我有MainActivity,它开始DetailsActivityDetailsActivity布局仅包含显示DetailsFragment所需的一个FrameLayout避免在创建片段之前显示活动布局

因此,当用户从MainActivity点击按钮,DetailsActivity开始:

public class DetailsActivity extends ActionBarActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_info); 
     displayFragment(); 
    } 

    public void displayFragment(){ 
     Fragment fragment = DetailsFragment.newInstance(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.fragment_container, fragment); 
     transaction.commit(); 
    } 
} 

的问题是,以前DetailsActivityonCreate结束DetailsFragmentonCreateView,让用户看到了多毫秒空白活动布局。有什么办法可以避免它?

+0

之前,你是怎么知道的'DetailsActivity'完成? – 2015-04-01 06:44:39

+0

@MD你误解了我,我的意思是'DetailsActivity'' onCreate'方法早些时候完成'DetailsFragment' onCreateView',所以活动布局显示在前面,比片段布局被初始化。但是在活动布局中,只有一个容器用于片段,因此用户看到片刻的空白活动。 – mol 2015-04-01 07:40:57

回答

0

这实际上是我的错误。我在谈论的延迟是由于我为片段过渡添加了自定义幻灯片动画。在创建活动的情况下,反向栈是空的,并且在显示第一个分段布局之前它会造成很小的延迟。所以我加了检查:

if (fragmentManager.getBackStackEntryCount() != 0) 

调用

transaction.setCustomAnimations(R.anim.in_transition_left, R.anim.out_transition_left); 
0

根据你的问题,你必须做这样你的onCreate内:

if (savedInstanceState == null) { 

       Fragment fragment = DetailsFragment.newInstance(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.fragment_container, fragment); 
     transaction.commit(); 

     } 

而且如果这样做之后,发生了误差,那么请告诉我们您的片段Java类。

+0

感谢您的回复。我不明白它有什么用处。问题是'DetailsActivity''onCreate'方法之前完成了'DetailsFragment' onCreateView',所以活动布局显示在前面,比片段布局被初始化。但是在活动布局中,只有一个容器用于片段,因此用户看到片刻的空白活动。只有在活动启动时才会发生。如果我在创建活动后切换片段,则不会有任何延迟,因为活动布局已经创建。 – mol 2015-04-01 07:46:25

1

的问题是,DetailsActivity的onCreate完成之前 DetailsFragment onCreateView

,预计的,因为从here

提交()时间表提交本次交易的。提交不会立即发生 ;它将被安排为在主线程工作 要做的下一次线程准备

可不久后提交尝试fragmentManager.executePendingTransactions()

检查executePendingTransactions

+0

感谢您的回复。我明白,这是预期的,我想知道是否有办法避免它,也许是不同的设计或什么。附: 'fragmentManager.executePendingTransactions()'没有帮助。 – mol 2015-04-01 07:43:16

+0

@mol尝试将片段放入“activity_info.xml”本身,而不是动态添加它。 – 2015-04-01 09:24:34

3

这是不可能的。

为了显示Fragment它必须放在容器中。在你的情况下,容器(R.id.fragment_container)是你的主布局(R.layout.activity_info)的一部分。

必然地,为了R.id.fragment_container可用以接受Fragment,R.layout.activity_info MUST一直在呼吁以下...

transaction.replace(R.id.fragment_container, fragment); 
transaction.commit(); 

不幸的是,之前充气commiting一个FragmentTransaction的行为是异步的,最重要的是,你不得不打电话......

setContentView(R.layout.activity_info); 

...为了有一个有效的参考commiting在交易前到FrameLayout(通过R.id.fragment_container)。

Fragment变得可见的时间可能会因许多因素(设备功能,Fragment布局和辅助代码的复杂程度等)而异。它可能会捣鼓流程订单,但是没有官方的方式,结果可能会在不同的Android设备上或多或少地成功。

如果您真的担心用户短时间看到空白屏幕,那么我建议您使用Activity创建一个ProgressDialog,并带有一个简单的“Please wait ...”消息 - 在创建对话框之前提交交易并在Fragment完全创建后解除该交易。

相关问题