Android 片段分离

Posted

技术标签:

【中文标题】Android 片段分离【英文标题】:Android Fragment detach 【发布时间】:2014-10-06 12:28:07 【问题描述】:

我有一个包含两个片段的活动。一个片段以纵向显示,另一个以横向模式显示。片段是用 java 添加的。

Fragment fragment = null;
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) 
            fragment = new FragmentPortrait();
         else 
            fragment = new FragmentLandscape();
        

        if (fragment != null) 
            addFragment(fragment, savedInstanceState == null);
        

private void addFragment(Fragment fragment, boolean add) 
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();

        detachFragment("fragment");

        if (add) 
            fragmentTransaction.add(R.id.layoutForFragment, fragment,
                    "fragment");
         else 
            fragmentTransaction.replace(R.id.layoutForFragment,
                    fragment, "fragment");
        

        fragmentTransaction.commit();
    

private void detachFragment(String fragmentTag) 
        Fragment fragment = getSupportFragmentManager().findFragmentByTag(
                fragmentTag);

        if (fragment != null) 
            Log.i(TAG, "detaching");
            getSupportFragmentManager().beginTransaction().remove(fragment)
                    .commit();
        
    

我的问题是,如果我在纵向模式下开始我的活动,并且当我旋转屏幕时,横向片段会按预期显示,但纵向片段中的 onActivityCreated 也会被调用。这意味着肖像片段仍然存在。你能告诉我我的错误在哪里吗?

【问题讨论】:

您不需要手动分离碎片。尝试替换它们。 【参考方案1】:

Keep it simple:: Replacing Fragment = Removing Current Fragment + Adding New Fragment


Sample:: saveInstance和其他东西修改你的需求


Boolean mFlag=false;

        Fragment fragment = null; 

        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) 
        if(mFlag==false) 
            FragmentPortrait();
            mFlag=true; 
         else  
        if(mFlag==true)
            FragmentLandscape();
            mFlag=false;
         

        FragmentPortrait()
         // Perform Action:: Replacing a fragment with the fragment you want to add in Portrait
        

        FragmentLandscape()
        // Perform Action:: Replacing a fragment with the fragment you want to add in Landscape
        

 

【讨论】:

我之前没有分离方法,但注意到了这个问题并尝试了它,但它仍然不起作用..我会修复我的代码,但是当我改变时你能告诉我(对于例如)从纵向到横向为什么还要调用纵向的onActivityCreated? @Crash-ID .... onActivityCreated 将被调用,因为片段被销毁并创建! .......但我不知道为什么OnOrientation从纵向变为横向为什么肖像的onActivityCreated也被称为........如果你想通过限制来防止这种尝试使用flags ...因为全局变量在OnOrientation类中没有被破坏,改变! ......检查编辑! .... 希望对您有所帮助 ...Note- 根据您的需要修改标志设置!

以上是关于Android 片段分离的主要内容,如果未能解决你的问题,请参考以下文章

分离不触发 onSaveInstanceState() 的片段

Android获取片段宽度

Android:片段 backStack

android:当用户触摸片段外部时,我如何关闭片段?

Android - 片段转换时出现黑屏

Android:导航抽屉片段内的Viewpager