片段无法正常工作取向变化后 [英] Fragments Not Working Correctly After Orientation Change

查看:185
本文介绍了片段无法正常工作取向变化后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有碎片问题和方向的变化。

我有其中有一个应用程序中的 MainActivity 它处理交换了片段通过标签操作栏。这里是code的标签操作栏,并且在选择一个标签。

 私有类MyTabListener<吨延伸android.support.v4.app.Fragment>实现ActionBar.TabListener {
    私人android.support.v4.app.Fragment mFragment;
    私人最终活动mActivity;
    私人最终字符串MTAG;
    私人最终类别< T> mClass;

    公共MyTabListener(SherlockFragmentActivity活动,字符串变量,类< T> CLZ){
        mActivity =活动;
        MTAG =标签;
        mClass = CLZ;
    }

    @覆盖
    公共无效onTabSelected(TAB键,android.support.v4.app.FragmentTransaction英尺){
        如果(mFragment == NULL){//检查是否该片段已被初始化。如果没有创建一个新的。
            mFragment = android.support.v4.app.Fragment.instantiate(mActivity,mClass.getName());
            ft.add(android.R.id.content,mFragment,MTAG);
        } 其他 {
            ft.attach(mFragment); //如果该片段已被初始化其附加到当前活动
        }
    }

    @覆盖
    公共无效onTabUnselected(TAB键,android.support.v4.app.FragmentTransaction英尺){
        如果(mFragment!= NULL){
            ft.detach(mFragment); //当一个片段不再需要,从活动的分离,但不破坏它
        }
    }

    @覆盖
    公共无效onTabReselected(TAB键,android.support.v4.app.FragmentTransaction英尺){

    }
 

我看到它的方式是,一切都正常工作时,在人像模式中的应用程序首次加载。当我旋转,由于某种原因,片段1的另一个实例添加,然后在选择其它选项卡不沾边。这也是如此,当我再旋转回肖像。

我一直使用 setRetainInstance(真)尝试; 在我的片段但这不起作用。

有没有一种方法,我需要重写或做一些与我的片段旋转过吗?

在此先感谢。

修改我现在已经看到onTabSelected再次调用活动时重建。难道这是我的问题,碎片附着不止一次的原因是什么?

下面是我的活动onCreate方法。

  super.onCreate(savedInstanceState);

        如果(savedInstanceState == NULL){
           //setContentView(R.layout.main);

        }
     //创建操作栏与标签
        动作条动作条= getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(假);
        //创建一个跟踪选项卡并将其添加到操作栏。
        TAB键= actionBar.newTab()
                            .setText(跟踪)
                            .setTabListener(新MyTabListener< TrackingFragment>(这一点,跟踪,TrackingFragment.class));
        actionBar.addTab(标签);

        //创建一个滑雪道的选项卡并将其添加到操作栏。
        标签= actionBar.newTab()
                        .setText(某事曲目)
                        .setTabListener(新MyTabListener< TrackListFragment>(这一点,somethingtracks,TrackListFragment.class));
        actionBar.addTab(标签);

        //创建照片的选项卡并将其添加到操作栏。
        标签= actionBar.newTab()
                        .setText(照片)
                        .setTabListener(新MyTabListener<光碎片>(这一点,照片,PhotoFragment.class));
        actionBar.addTab(标签);
 

解决方案

短FIX:

onTabSelected 法,使用前如果(mFragment == NULL)你需要尝试获得片段(使用 mFragment = getSupportFragmentManager()。findFragmentByTag(MTAG))。您还可以设置这个从外面,但我没有看到你这样做。

检查如果(savedInstanceState == NULL)的onCreate 也可以解决这个问题,我认为这是一个更好的方法虽然! :)

I am having a problem with Fragments and orientation change.

I have an application which has a MainActivity which handles the switching up Fragments via a tabbed action bar. Here is the code for the tabbed action bar and when a tab is selected.

private class MyTabListener <T extends android.support.v4.app.Fragment> implements ActionBar.TabListener {
    private android.support.v4.app.Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public MyTabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    @Override
    public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        if (mFragment == null){ // check to see if the fragment has already been initialised. If not create a new one.
            mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content,mFragment,mTag);
        } else {
            ft.attach(mFragment); // if the fragment has been initialised attach it to the current activity
        }
    }

    @Override
    public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        if (mFragment != null){
            ft.detach(mFragment); // when a fragment is no longer needed, detach it from the activity but dont destroy it
        }
    }

    @Override
    public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {

    }

The way I see it is that everything works fine when the application first loads in portrait mode. When I rotate, for some reason another instance of Fragment1 is added and then isn't detached when another tab is selected. This is also the case when I then rotate back to portrait.

I have tried using setRetainInstance(true); in my Fragments but this doesn't work.

Is there a method I need to override or do something with my Fragments before rotating?

Thanks in advance.

EDIT I have now seen that onTabSelected is called again when the activity is recreated. Could this be the cause of my problem with fragments being attached more than once?

Here is my activities onCreate method.

super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
           //setContentView(R.layout.main);

        }
     // Create the Action Bar with tabs
        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);
        //create the tab for track and add it to the action bar.
        Tab tab = actionBar.newTab()
                            .setText("Track")
                            .setTabListener(new MyTabListener<TrackingFragment>(this,"track",TrackingFragment.class));
        actionBar.addTab(tab);

        //create the tab for ski tracks and add it to the action bar.
        tab = actionBar.newTab()
                        .setText("Something Tracks")
                        .setTabListener(new MyTabListener<TrackListFragment>(this,"somethingtracks",TrackListFragment.class));
        actionBar.addTab(tab);

        //create the tab for photos and add it to the action bar.
        tab = actionBar.newTab()
                        .setText("Photos")
                        .setTabListener(new MyTabListener<PhotoFragment>(this,"photos",PhotoFragment.class));
        actionBar.addTab(tab);

解决方案

Short fix:

In the onTabSelected method, before using if (mFragment == null) you need to try to get the fragment (using mFragment = getSupportFragmentManager().findFragmentByTag(mTag)). You can also set this from the outside but I don't see you doing this.

Checking if(savedInstanceState == null) on onCreate could also solve this and I consider it a better approach though! :)

这篇关于片段无法正常工作取向变化后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆