【问题标题】:Previously detached fragment stays visible behind the current, after tab changed (using support library)更改选项卡后,先前分离的片段在当前片段后面保持可见(使用支持库)
【发布时间】:2013-09-25 14:13:59
【问题描述】:

这是我的 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...没有显示后面的另一个片段,但内容有所更改。

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

【问题讨论】:

    标签: java android android-fragments


    【解决方案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 重新启动时销毁和重新创建(例如,在方向更改后)。

    非常感谢克里斯!

    【讨论】:

      【解决方案2】:

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

      @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 3.0 之前,您不应将 android.R.id.content 与 ActionBarActivity 一起使用。支持操作栏被添加到 android.R.id.content 中,并且通过将您的片段替换到其中,您将删除 ActionBar。 (我知道很讨厌。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        相关资源
        最近更新 更多