当屏幕旋转时,避免替换的片段调用前一个片段

时间:2015-07-30 08:15:46

标签: android android-fragments rotation

嘿伙计我试图制作一个活动,当一个抽屉中的项目被选中时,有一个framelayout发生了变化,但我的问题是当我旋转屏幕时,被替换的片段会回到之前的片段。恩。我打开了应用程序,它向我显示了片段A然后我尝试从抽屉中选择另一个片段B片段然后当我尝试旋转而片段B上的Im时它返回片段A.这是我的代码。 / p>

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();

        passedFragment = this.getIntent().getExtras().getString("fragmentClass");

        if(savedInstanceState != null){
             getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);

        }
            switch (passedFragment){
                case "com.serverus.oom.fragments.FragmentAgency":
                    fragmentClass = FragmentAgency.class;

                    menuItemReserve = mMenu.findItem(R.id.agency_menu_item);
                    break;
                case "com.serverus.oom.fragments.FragmentServices2":
                    fragmentClass = FragmentServices2.class;
                    menuItemReserve = mMenu.findItem(R.id.services_menu_item);
                    break;
                case "com.serverus.oom.fragments.FragmentContactUs":
                    fragmentClass = FragmentContactUs.class;
                    menuItemReserve = mMenu.findItem(R.id.contact_menu_item);
                    break;
                default:
                    fragmentClass = FragmentAgency.class;
                    break;
            }
        fragmentReplace(fragmentClass);

}


 public void fragmentReplace(Class fragmentClass) {

        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = this.getSupportFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();

                ft.replace(R.id.flContent, fragment, FRAGMENT_TAG).addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE).commit();


        }

先谢谢

3 个答案:

答案 0 :(得分:0)

在创建的片段中使用setRetainInstance(true)。有关详细信息,请参阅此问题 - Further understanding setRetainInstance(true)

setRetainInstance(true) - 应该在片段活动的onCreate()中提及。

请注意

  

注意:每个片段都需要一个唯一的标识符,如果重新启动活动,系统可以使用该标识符来恢复片段(您可以使用它来捕获片段以执行事务,例如删除它)。有三种方法可以为片段提供ID:

     

•提供具有唯一ID的android:id属性。

     

•使用唯一字符串提供android:tag属性。

     

•如果您不提供前两个,系统将使用容器视图的ID。

这强烈暗示如果在Activity.onCreated()中执行setContentView(R.layout.whatever)并且该布局包含具有setRetainInstance(true)的片段,那么当重新创建活动时,将再次使用其搜索id或tag。

答案 1 :(得分:0)

你能展示你的所有代码吗?我的帮助可能会更好......

也许是因为你没有将savedFragment存储在saveInstance中,当你旋转屏幕时,活动会重新创建自己,passFragment包含null。所以" FragmentAgency.class"旋转时将始终设置(默认值)。

此代码:

passedFragment = this.getIntent().getExtras().getString("fragmentClass");

..返回null,因为你只能获得" fragmentClass"在startActivity(..)创建活动时的值。

检查: http://developer.android.com/training/basics/activity-lifecycle/recreating.html了解如何使用活动状态来保存和加载活动数据。

答案 2 :(得分:0)

-(void) viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.backBarButtonItem.title = @"Back to A"
    self.navigationItem.backBarButtonItem.image = nil;
}