1

我正在尝试更改使用FragmentTabHostand创建的选项卡的内容getSupportFragmentManager(),但我不知道该怎么做。这是我所拥有的:

mTabHost = new FragmentTabHost(this);
    setContentView(mTabHost);

    mTabHost.setup(this, getSupportFragmentManager(),R.id.menu_settings);
    mTabHost.addTab(mTabHost.newTabSpec("A").setIndicator("A"),
            A.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("B").setIndicator("B"),
            B.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("C").setIndicator("C"),
            C.class, null);

每个加载的类都扩展了片段,并在onCreateView它们上膨胀了它们的布局。

问题是我在其中一个中有一个对话框(例如 A.class ),并且根据对话框的响应,我需要导航到片段 D,将其放在选项卡 C 上我应该怎么做?我可以从对话框与创建选项卡并指定片段的活动进行通信,但我不知道如何更改选项卡内的片段(在本例中为 C )。

作为总结,我需要在放置 C 的选项卡内将片段 C 更改为 D。我正在使用支持库。

谢谢!!

4

1 回答 1

0

创建一个类就像一个片段容器。

例如:

public class FragmentContainer extends SherlockFragment implements OnBackStackChangedListener {
public static final String PARAM_CONTENT_FRAGMENT = "param_content_fragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    return inflater.inflate(R.layout.frag_container, null);
}

public void replaceContent(Class<? extends Fragment> clz, Bundle args) {
    FragmentTransaction tx = getChildFragmentManager().beginTransaction();

    tx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // save
    Fragment curFrag = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    tx.addToBackStack(curFrag.getClass().getSimpleName());

    // change
    try {
        Fragment newFragment = clz.newInstance();
        newFragment.setArguments(args);
        tx.replace(R.id.fragment_content, newFragment, clz.getClass().getSimpleName());
        tx.commit();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}

@Override
public void onResume() {
    super.onResume();
    Fragment f = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    if (f == null) {
        Class<? extends Fragment> claz = (Class<? extends Fragment>) getArguments().getSerializable(
                PARAM_CONTENT_FRAGMENT);
        FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        try {
            f = claz.newInstance();
            f.setTargetFragment(this, 0);
            tx.add(R.id.fragment_content, f);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

这里有几个关键点:

  1. 使用 FragmentContainer.class 初始化第三个选项卡,并提供 C.class 作为片段参数。(参数键是 PARAM_CONTENT_FRAGMENT)

  2. onCreateView() 只需创建一个带有 id @+id/fragment_content 的 FrameLayout,这是我们放置子片段的地方。

  3. onResume() 如果不存在,则将子片段放入 FrameLayout。

  4. replaceContent() 当 Fragment-C 想要将其自身更改为 Fragment-D 时调用此方法。

在 Frament-C 中,例如:

((FragmentContainer)getParentFragment() ).replaceContent( D.class, null );
于 2013-04-09T13:31:19.933 回答