Android: ActionBar, TabListener and support.v4.Fragment

梦想与她 提交于 2019-12-05 05:51:55

Thanks for the answer, I had this exact same problem with the support library where the fragments will be overlaid ontop of each other when i tried to switch between tabs. There were a couple of unused variables in the solution so I cleaned it up a bit:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {

  private Fragment mFragment;
  private final FragmentActivity mActivity;
  private final String mTag;
  private final Class<T> mClass;
  private FragmentTransaction fft;

  public TabListener(FragmentActivity activity, String tag, Class<T> clz) {

      mActivity = activity;
      mTag = tag;
      mClass = clz;

      // Check to see if we already have a fragment for this tab, probably
      // from a previously saved state. If so, deactivate it, because our
      // initial state is that a tab isn't shown.
      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
      if (mFragment != null && !mFragment.isDetached()) {

          fft = mActivity.getSupportFragmentManager().beginTransaction();
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager()
          .executePendingTransactions();
      }
  }

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

      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
      fft = mActivity.getSupportFragmentManager().beginTransaction();

      if (mFragment == null) {

          // If not, instantiate and add it to the activity
          mFragment = Fragment.instantiate(mActivity, mClass.getName());
          ft.add(R.id.content_view, mFragment, mTag);
          //fft.add(android.R.id.content, mFragment, mTag);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      } else {

          // If it exists, simply attach it in order to show it
          fft.attach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      }
  }

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

  }

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

      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

      if (mFragment != null && !mFragment.isDetached()) {
          fft = mActivity.getSupportFragmentManager().beginTransaction();
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      }
  }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!