避免在创建 Fragment 之前显示 Activity 布局

Avoid Activity layout showing before Fragment is created

我有 MainActivityDetailsActivity 开始。 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 onCreateDetailsFragment 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()

检查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);