2

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

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

这是其中的一些内容:

活动:

// In onCreate:
@Override
  protected void onCreate(Bundle savedInstanceState) {
    // Check that the activity is using the layout version with
    // the fragment_container FrameLayout
    if (findViewById(R.id.fragment_container) != null) {
      // However, if we're being restored from a previous state,
      // then we don't need to do anything and should return or else
      // we could end up with overlapping fragments.
      if (savedInstanceState != null) {
        return;
      }
      // Create an instance of FList
      fList = new FList();
      // Add the fragment to the 'fragment_container' FrameLayout
      getFragmentManager().beginTransaction().add(R.id.fragment_container,fList).commit();
    }
  }



// After clicking on an item of the listview changeFragment() is called
public void changeFragment() {
  FragmentTransaction ft = getFragmentManager().beginTransaction();
  fSpeed = new FSpeed();
  ft.add(R.id.fragment_container, fSpeed);

  // this might be necessary
  if (actionBar != null)
    actionBar.selectTab(tabSpeed);
  ft.commit();
}

// In the activity I also setup the ActionBar with tabs
private void setupActionBar() {
  tabSpeed = actionBar.newTab();
  // and a few more tabs...
  tabSpeed.setTabListener(this);
  actionBar.addTab(tabSpeed);
  // But the tabs are not visible because of the navigation mode
  actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}

// Here is the tabListener - very hacky!
@Override
  public void onTabSelected(Tab tab, FragmentTransaction ft)
    if (fm == null)
      fm = getFragmentManager();
    Fragment f = null;
    switch (tab.getPosition()) {
    case 0:
      if (fSpeed == null)
        fSpeed = new FSpeed();
      f = findFragment(fSpeed);
      if (f != null) {
        ft.setCustomAnimations(R.anim.fragment_alpha_0_1, R.anim.fragment_alpha_1_0);
        ft.remove(f);
        ft.add(R.id.fragment_container, fSpeed);
      } else {
        Log.d(TAG, "fSpeed is " + f);
        return;
      }
      break;
      case 1:
        // more tabs - similar code
    }

// the findFragment() method
private Fragment findFragment(Fragment selectedFragment) {
  if (fm.findFragmentById(R.id.fragment_container) == fSpeed && selectedFragment != fSpeed)
    return fSpeed;
  // more ifs for other fragments
  else
    return null;
}

这一切都很好,但是在选项卡之间切换 x 次后,事情开始看起来很有趣,例如 fList 可见,选项卡图标消失了,......我可以追踪错误并添加一些空检查,但我认为我错了方法。这就是为什么我将 TabListener 更改为以下内容:

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

这是问题开始的地方。在使用新的 TabListener 从列表视图中单击一个项目后,onTabSelected 和 onTabUnSelected 会被无休止地轮流调用。

问题:

我的问题是如何在单击列表视图的项目后从带有列表视图的片段转到另一个片段(并且仍然使用相同的活动)。我自己写的方法 changeFragment() 是错误的方法吗?我仍然想使用 MyTabListener。

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

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

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

4

1 回答 1

0

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

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

于 2012-11-01T07:31:28.720 回答