android,动态更改选项卡内的片段

时间:2013-02-15 01:31:05

标签: android tabs android-tabhost

我正在尝试更改使用FragmentTabHostgetSupportFragmentManager()创建的标签的内容,但我不知道该怎么做。 这就是我所拥有的:

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. 我正在使用支持库。

谢谢!

1 个答案:

答案 0 :(得分: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时。

  5. 在Frament-C中,例如:

    ((FragmentContainer)getParentFragment() ).replaceContent( D.class, null );