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

时间:2015-04-01 06:43:26

标签: android android-fragments android-activity android-fragmentactivity

MainActivity启动DetailsActivityDetailsActivity布局仅包含显示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 onCreateDetailsFragment onCreateView之前完成,因此用户会看到空白活动布局达数毫秒。有什么方法可以避免吗?

4 个答案:

答案 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()

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