1

这是我的 TabListener:

    public class TabListener<T extends Fragment> implements android.support.v7.app.ActionBar.TabListener {

    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity, String tag, Class<T> cl) {
        mActivity = activity;
        mTag = tag;
        mClass = cl;
    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {

        mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag);   // add this

        if (mFragment == null){ 
            mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName()); 
            ft.add(android.R.id.content,mFragment,mTag);
        } else {
            ft.attach(mFragment);
        }             
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag);   // add this
        if (mFragment != null) {
            //Toast.makeText(mActivity, "detached", Toast.LENGTH_SHORT).show();
            ft.detach(mFragment);
        }
    }

}

我的活动的一部分:

public class RoadMapActivity extends ActionBarActivity {

ListView generalRoadmapList;
ListView mainRoadmapList;
android.support.v7.app.ActionBar actionBar;

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

    actionBar = getSupportActionBar();        
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayUseLogoEnabled(true);       
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    Tab generalTab = actionBar.newTab()
            .setText("General")
            .setTabListener(new TabListener<GeneralListFragment>(this, "general", GeneralListFragment.class));
    actionBar.addTab(generalTab);

    Tab myTab = actionBar.newTab()
                        .setText("My")
                        .setTabListener(new TabListener<MyListFragment>(this, "my", MyListFragment.class));
    actionBar.addTab(myTab);
}

我试图将 viewGroup 从 android.R.id.content 更改为 Activity 布局中的自定义视图组,接下来会发生:

我有两个选项卡,A 和 B。启动活动后,活动选项卡是 A,内容是片段 A。如果切换到 B,选项卡 B 会激活,但内容仍然是片段 A。然后改回选项卡 A ,内容将是片段 B。更改为选项卡 B,内容是片段 A... 不显示后面的另一个片段,但更改了内容。

我已经尝试了我在谷歌和这里找到的所有东西,但没有任何成功。有人有想法吗?

4

2 回答 2

1

我基于克里斯的回答的最终解决方案:

    public class TabListener<T extends Fragment> implements android.support.v7.app.ActionBar.TabListener {

    private Fragment mFragment;
    private String mTag;
    private boolean added = false;

    private TabListener(String tag, Fragment fragment) {
        mTag = tag;
        mFragment = fragment;
    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {

        if (!added){                
            ft.replace(R.id.list_container,mFragment,mTag);
            added = true;
        } else {
            ft.attach(mFragment);
        } 
    }       

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.detach(mFragment);
    }

}

片段的实例化(每个选项卡都有自己的侦听器):

        Tab myTab = actionBar.newTab()
                        .setText("My")
                        .setTabListener(new TabListener<MyListFragment>("my", new MyListFragment()));
    actionBar.addTab(myTab);

我已经完成了您的解决方案,因为这样片段不会在每个选项卡更改时破坏和创建,如果您更改回它们,您会发现它处于相同的状态。仅在 Activity 重新启动时销毁和重新创建(例如,在方向更改后)。

非常感谢克里斯!

于 2013-09-25T06:13:59.880 回答
0

您正在完全错误地实例化您的片段。看看修改后的方法。

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

   Fragment mFragment;
   switch(tab.getPosition(){ 
     case 0:
       /* create fragment in here based on which tab, mFragment = new ExampleFrag */ 
       break;
     case 1:
       /* create fragment in here based on which tab, mFragment = new ExampleFrag */ 
       break;
   }

   ft.replace(android.R.id.content, mFragment);
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
   // Dont need to do anything.
}

简单得多。

值得注意的是,android.R.id.content在 Android 3.0 之前,您不应与 ActionBarActivity 一起使用支持操作栏被添加到android.R.id.content其中,通过将您的片段替换到其中,您将删除 ActionBar。(讨厌我知道。)

于 2013-09-24T18:11:09.900 回答