android - 方向更改后 fragment 无法正常工作

标签 android android-fragments

我遇到了 Fragments 和方向改变的问题。

我有一个应用程序,它有一个 MainActivity,它通过选项卡式操作栏处理 Fragments 的切换。以下是选项卡式操作栏的代码以及选择选项卡时的代码。

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) {

    }

我的看法是,当应用程序首次以纵向模式加载时,一切正常。当我旋转时,出于某种原因添加了另一个 Fragment1 实例,然后在选择另一个选项卡时不会分离。当我然后旋转回纵向时也是这种情况。

我已经尝试在我的 Fragments 中使用 setRetainInstance(true); 但这不起作用。

在旋转之前,我需要覆盖或对我的 Fragments 做些什么的方法吗?

提前致谢。

编辑 我现在看到重新创建 Activity 时会再次调用 onTabSelected。这可能是我多次附加 fragment 的问题的原因吗?

这是我的 Activity onCreate 方法。

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

最佳答案

简短修复:

onTabSelected 方法中,在使用 if (mFragment == null) 之前,您需要尝试获取 fragment (使用 mFragment = getSupportFragmentManager()。 findFragmentByTag(mTag)).您也可以从外部进行设置,但我看不到您这样做。

onCreate 上检查 if(savedInstanceState == null) 也可以解决这个问题,但我认为这是一种更好的方法! :)

关于android - 方向更改后 fragment 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085476/

相关文章:

android - 改造无法返回数据错误代码 400

android - 如何在android中的可运行线程中显示对话框?

android - 将 OR 运算符与 2 个具有相同值的占位符一起使用

java - 在 Android 上执行长时间运行的任务时选择哪种策略?

Android fragment 过渡

java - backStack 中的 fragment

android - 通过 onListItemClick() 更改 Activity 内的 Fragments

android - Canvas 缩放保留像素大小

android - 在 fragment 的微调器中使用 setOnItemSelectedListener 时出现错误?

android - 为什么使用 Fragment#setRetainInstance(boolean)?