避免在创建 Fragment 之前显示 Activity 布局
Avoid Activity layout showing before Fragment is created
我有 MainActivity
从 DetailsActivity
开始。 DetailsActivity
布局仅包含显示 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();
}
}
问题是 DetailsActivity
onCreate
在 DetailsFragment
onCreateView
之前完成,因此用户会看到空白 activity 布局多毫秒。有什么办法可以避免吗?
根据你的问题,你必须在你的 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 class.
The problem is that DetailsActivity onCreate finishes before
DetailsFragment onCreateView
这是意料之中的,因为来自 here:
commit() Schedules a commit of this transaction. The commit does not
happen immediately; it will be scheduled as work on the main thread to
be done the next time that thread is ready
您可以在提交后立即尝试 fragmentManager.executePendingTransactions()
。
这是不可能的。
为了显示 Fragment
必须将其放入容器中。在您的情况下,容器 (R.id.fragment_container) 是主布局 (R.layout.activity_info) 的一部分。
因此,为了使 R.id.fragment_container 可用于接受 Fragment
,R.layout.activity_info 必须 在调用正在关注...
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
不幸的是,提交 FragmentTransaction
的行为是异步的,最重要的是,您必须调用...
setContentView(R.layout.activity_info);
...在提交事务之前,以便有效引用 FrameLayout
(通过 R.id.fragment_container)。
Fragment
变为可见所需的时间可能因许多因素(设备功能、Fragment
布局的复杂性和辅助代码等)而异。它 可能 可以 fiddle 处理顺序,但没有正式的方法可以做到这一点,结果可能或多或少在不同的 Android 设备上成功。
如果您真的担心用户会在短时间内看到空白屏幕,那么我的建议是让 Activity
使用简单的 [=39= 创建一个 ProgressDialog
] 消息 - 在提交事务之前创建对话框,并在 Fragment
完全创建后关闭它。
其实是我的错。我所说的延迟是由于我向片段过渡添加了自定义幻灯片动画。在 activity 创建的情况下,返回堆栈为空,并且在显示第一个片段布局之前造成了小的延迟。所以我添加了检查:
if (fragmentManager.getBackStackEntryCount() != 0)
在调用
之前
transaction.setCustomAnimations(R.anim.in_transition_left, R.anim.out_transition_left);
我有 MainActivity
从 DetailsActivity
开始。 DetailsActivity
布局仅包含显示 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();
}
}
问题是 DetailsActivity
onCreate
在 DetailsFragment
onCreateView
之前完成,因此用户会看到空白 activity 布局多毫秒。有什么办法可以避免吗?
根据你的问题,你必须在你的 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 class.
The problem is that DetailsActivity onCreate finishes before DetailsFragment onCreateView
这是意料之中的,因为来自 here:
commit() Schedules a commit of this transaction. The commit does not happen immediately; it will be scheduled as work on the main thread to be done the next time that thread is ready
您可以在提交后立即尝试 fragmentManager.executePendingTransactions()
。
这是不可能的。
为了显示 Fragment
必须将其放入容器中。在您的情况下,容器 (R.id.fragment_container) 是主布局 (R.layout.activity_info) 的一部分。
因此,为了使 R.id.fragment_container 可用于接受 Fragment
,R.layout.activity_info 必须 在调用正在关注...
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
不幸的是,提交 FragmentTransaction
的行为是异步的,最重要的是,您必须调用...
setContentView(R.layout.activity_info);
...在提交事务之前,以便有效引用 FrameLayout
(通过 R.id.fragment_container)。
Fragment
变为可见所需的时间可能因许多因素(设备功能、Fragment
布局的复杂性和辅助代码等)而异。它 可能 可以 fiddle 处理顺序,但没有正式的方法可以做到这一点,结果可能或多或少在不同的 Android 设备上成功。
如果您真的担心用户会在短时间内看到空白屏幕,那么我的建议是让 Activity
使用简单的 [=39= 创建一个 ProgressDialog
] 消息 - 在提交事务之前创建对话框,并在 Fragment
完全创建后关闭它。
其实是我的错。我所说的延迟是由于我向片段过渡添加了自定义幻灯片动画。在 activity 创建的情况下,返回堆栈为空,并且在显示第一个片段布局之前造成了小的延迟。所以我添加了检查:
if (fragmentManager.getBackStackEntryCount() != 0)
在调用
之前transaction.setCustomAnimations(R.anim.in_transition_left, R.anim.out_transition_left);