Android 正确使用片段和TabListener

Android 正确使用片段和TabListener,android,android-fragments,Android,Android Fragments,我的问题是关于标签的碎片。我有一个活动,它基本上是一个空的布局,我动态地向它添加片段。一旦我开始这个活动,我会添加一个带有列表视图的片段,当我点击列表中的一个项目时,我会删除带有列表视图的片段,并添加另一个带有详细信息的片段。现在还可以看到一些选项卡。单击其中一个选项卡可显示listview中项目的其他详细信息 我确实有工作代码,但似乎我正在完全破解它 以下是其中的一些内容: 活动: 这一切在一分钟内都很好,但在标签之间切换x次后,事情开始变得有趣,例如fList可见,标签图标消失。。。我可以追

我的问题是关于标签的碎片。我有一个活动,它基本上是一个空的布局,我动态地向它添加片段。一旦我开始这个活动,我会添加一个带有列表视图的片段,当我点击列表中的一个项目时,我会删除带有列表视图的片段,并添加另一个带有详细信息的片段。现在还可以看到一些选项卡。单击其中一个选项卡可显示listview中项目的其他详细信息

我确实有工作代码,但似乎我正在完全破解它

以下是其中的一些内容:

活动: 这一切在一分钟内都很好,但在标签之间切换x次后,事情开始变得有趣,例如fList可见,标签图标消失。。。我可以追踪bug并添加一些空检查,但我认为我走错了方向。这就是为什么我将TablListener更改为以下内容:

// Still in activity
public static class MyTabListener<T extends Fragment> implements TabListener {
  private Fragment mFragment;
  private final Activity mActivity;
  private final String mTag;
  private final Class<T> mClass;
  /**
  * * Constructor used each time a new tab is created. 
  * * * @param
  * activity * The host Activity, used to instantiate the fragment 
  * * @param
  * tag * The identifier tag for the fragment 
  * * @param clz * The
  * fragment's Class, used to instantiate the fragment
  */
  public MyTabListener(Activity activity, String tag, Class<T> clz) {
    mActivity = activity;
    mTag = tag;
    mClass = clz;
    }

  /* The following are each of the ActionBar.TabListener callbacks */
  public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // Check if the fragment is already initialized
    if (mFragment == null) {
      // If not, instantiate and add it to the activity
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(R.id.fragment_container, mFragment, mTag);
    } else {
    // If it exists, simply attach it in order to show it
      ft.attach(mFragment);
    }
  }

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  if (mFragment != null) {
    ft.detach(mFragment);
  }
}

// The tabs are now assigned to MyTabListener
tabSpeed.setTabListener(new MyTabListener<FSpeed>(this, "speed", FSpeed.class));
//仍在活动中
公共静态类MyTablListener实现了TablListener{
私人碎片;
私人最终活动能力;
私有最终字符串mTag;
私人期末班;
/**
**每次创建新选项卡时使用的构造函数。
****参数
*activity*主机活动,用于实例化片段
**@param
*tag*片段的标识符标记
**@param clz*该
*片段的类,用于实例化片段
*/
公共MyTableListener(活动、字符串标记、类clz){
活动性=活动性;
mTag=标签;
mClass=clz;
}
/*下面是ActionBar.TabListener回调的每个部分*/
已选择的公共事务(选项卡,碎片事务ft){
//检查片段是否已初始化
if(mFragment==null){
//如果不是,则实例化并将其添加到活动中
MFFragment=Fragment.instantiate(mActivity,mClass.getName());
ft.add(R.id.fragment_容器、mFragment、mTag);
}否则{
//如果存在,只需将其附加以显示即可
ft.attach(mFragment);
}
}
已选择公共空页(选项卡,碎片事务ft){
if(mFragment!=null){
ft.分离(mFragment);
}
}
//这些选项卡现在分配给MyTableSistener
tabSpeed.setTabListener(新的MyTabListener(这个“speed”,FSpeed.class));
问题从这里开始。在使用新的TablListener OnAbsSelected和OnAbuSelected从listview中单击一个项目后,会无休止地依次调用

问题: 我的问题是,在单击listview的一个项目(并且仍然使用相同的活动)之后,如何从一个具有listview的片段转到另一个片段。我自己编写的方法changeFragment()是否是错误的方法?我仍然想使用MyTablListener

注1:我买了Commonware的书来了解更多关于片段的知识,但我找不到一个更复杂的例子,不同片段一起工作,也找不到后退按钮是如何处理或覆盖的。例如,单击后退按钮后,如果片段1、2或3可见,则始终显示片段4。如果有人在这本书你能告诉我它的章节(名称)/页面吗?若并没有的话,那个么在下一次更新中提供一个章节(名称)/页面将是非常好的普通人

注2:项目中使用了全局变量,如fSpeed、tabSpeed等

注3:如果您需要更多的代码或解释,请在评论中告诉我。谢谢您的帮助

我自己编写的方法changeFragment()是错误的方法吗

您正在添加片段,而不是替换片段。若要替换片段,请使用
replace()
,而不是
add()

// Still in activity
public static class MyTabListener<T extends Fragment> implements TabListener {
  private Fragment mFragment;
  private final Activity mActivity;
  private final String mTag;
  private final Class<T> mClass;
  /**
  * * Constructor used each time a new tab is created. 
  * * * @param
  * activity * The host Activity, used to instantiate the fragment 
  * * @param
  * tag * The identifier tag for the fragment 
  * * @param clz * The
  * fragment's Class, used to instantiate the fragment
  */
  public MyTabListener(Activity activity, String tag, Class<T> clz) {
    mActivity = activity;
    mTag = tag;
    mClass = clz;
    }

  /* The following are each of the ActionBar.TabListener callbacks */
  public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // Check if the fragment is already initialized
    if (mFragment == null) {
      // If not, instantiate and add it to the activity
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(R.id.fragment_container, mFragment, mTag);
    } else {
    // If it exists, simply attach it in order to show it
      ft.attach(mFragment);
    }
  }

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  if (mFragment != null) {
    ft.detach(mFragment);
  }
}

// The tabs are now assigned to MyTabListener
tabSpeed.setTabListener(new MyTabListener<FSpeed>(this, "speed", FSpeed.class));