我MainActivity
启动DetailsActivity
。 DetailsActivity
布局仅包含显示FrameLayout
所需的一个DetailsFragment
。
因此,当用户点击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();
}
}
问题是DetailsActivity
onCreate
在DetailsFragment
onCreateView
之前完成,因此用户会看到空白活动布局达数毫秒。有什么方法可以避免吗?
答案 0 :(得分:3)
这是不可能的。
为了显示Fragment
,必须将其放入容器中。在您的情况下,容器(R.id.fragment_container)是主要布局的一部分(R.layout.activity_info)。
因此,为了让R.id.fragment_container可以接受Fragment
,在调用以下内容之前,R.layout.activity_info 必须已经膨胀... < / p>
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
不幸的是,提交FragmentTransaction
的行为是异步的,最重要的是,您必须致电...
setContentView(R.layout.activity_info);
...在提交事务之前,为了拥有对FrameLayout
的有效引用(通过R.id.fragment_container)。
Fragment
变得可见所需的时间可能会因许多因素(设备功能,Fragment
布局和辅助代码的复杂性等)而有所不同。 MAY 可以改变流程订单,但没有正式的方法,结果可能会在不同的Android设备上或多或少成功。
如果您真的担心用户会在短时间内看到空白屏幕,那么我建议的是Activity
创建一个简单的ProgressDialog
&# 34;请稍候...&#34; message - 在提交事务之前创建对话框,并在完全创建Fragment
后将其关闭。
答案 1 :(得分:1)
问题在于DetailsActivity onCreate之前完成 DetailsFragment onCreateView
这是预期的,因为来自here:
commit()计划此事务的提交。提交没有 马上发生;它将被安排为主线程上的工作 下次线程准备就绪时完成
您可以在提交后尽快尝试fragmentManager.executePendingTransactions()
。
答案 2 :(得分: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类。
答案 3 :(得分:0)
这实际上是我的错误。我所说的延迟是由于我为片段转换添加了自定义幻灯片动画。在活动创建的情况下,后栈是空的,并且在显示第一个片段布局之前导致小的延迟。所以我添加了检查:
if (fragmentManager.getBackStackEntryCount() != 0)
之前打电话
transaction.setCustomAnimations(R.anim.in_transition_left, R.anim.out_transition_left);