Java 在主活动显示主内容视图之前添加片段 飞溅
我的主活动UI启动操作需要5-10秒(需要在主UI线程上处理),因此我希望使用启动屏幕,而不是默认的黑色或无响应的主UI 下面提供了一个很好的闪屏解决方案Java 在主活动显示主内容视图之前添加片段 飞溅,java,android,user-interface,android-fragments,android-activity,Java,Android,User Interface,Android Fragments,Android Activity,我的主活动UI启动操作需要5-10秒(需要在主UI线程上处理),因此我希望使用启动屏幕,而不是默认的黑色或无响应的主UI 下面提供了一个很好的闪屏解决方案 首先设置的是setContentView(R.layout.splash) 然后执行必要的主UI处理(在UI线程上,但主视图不可见) 准备好后,显示setContentView(R.layout.main) 溅起碎片 我还使用了片段,通常需要在片段实例化之前调用setContentView(R.layout.main),这样片段管理器
- 首先设置的是
setContentView(R.layout.splash)
- 然后执行必要的主UI处理(在UI线程上,但主视图不可见)
- 准备好后,显示
setContentView(R.layout.main)
溅起碎片 我还使用了片段,通常需要在片段实例化之前调用
setContentView(R.layout.main)
,这样片段管理器就可以在R.layout.main
中找到视图存根,将片段膨胀成(严格来说,视图存根是另一回事)
- 但是在创建片段之前,我不能调用
,因为这样会用(尚未准备好的)主屏幕替换初始屏幕setContentView(R.layout.main)
- 我担心我想做的事做不到
- 不幸的是,没有像
fragmentTransaction.add(viewNotViewId,fragment)这样的重载代码>
几乎回答 以下是关键,即在片段事务之前调用
setContentView
:
在不调用任何
setContentView的情况下尝试此代码
fragmentTransaction.add(android.R.id.content, Fragment.instantiate(MainActivity.this, SplashFragment.class.getName()));
这里的主要方法是使用idandroid.R.id.content
将片段放置在视图中,在通过setContentView
扩展任何布局之前,该视图始终存在。您可以尝试在片段活动中替换片段,以下是部分编码的想法:
fragmentTransaction.add(android.R.id.content, Fragment.instantiate(MainActivity.this, SplashFragment.class.getName()));
假设您的片段布局如下(main.xml):
出于好奇:您认为在UI线程上真正需要做什么,可能需要10秒钟?这无疑是一个容易发生ANR的问题,对用户体验不利。如果你不将繁重的任务移到背景中,添加启动屏幕不会突然使你的应用程序“响应”。@MH可能接近5秒,因为我看不到ANR,但等待时间太长,用户无法盯着空白;ui是由大量数据绑定视图对象定制而成(一旦实例化,性能就很好)。问题是,我没有一个片段,而是多个片段,它们将在同一主布局中占据不同的占位符(至少在屏幕空间更大的平板电脑上)…我不确定我是否理解正确,但是我现在从一开始就使用了setContentView(R.layout.main)
,但是在隐藏片段占位符的同时将飞溅(可见)嵌入到主布局中-当片段都准备好了,我隐藏了飞溅布局并将片段布局设置为可见-效果不错@赛尔:没错。您可以替换同一容器中的片段,也可以像答案一样使用不同的容器(在本例中,更容易理解)。
public class FragmentsActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
Fragment fragA = new WaitingTransaction();
FragmentTransaction fragTrans = this.getSupportFragmentManager().beginTransaction();
fragTrans.add(R.main.waiting, fragA);
fragTrans.commit();
}
private void afterProcessing(){
//show hidden layout and make the waiting hidden through visibility, then add the fragment bellow...
FragmentTransaction fragTrans = this.getSupportFragmentManager().beginTransaction();
fragTrans.add(R.main.layout_list_items,
new FragmentList());
fragTrans.replace(R.main.layout_detail,
new FragmentB());
fragTrans.commit();
}
}