我正在尝试更改使用FragmentTabHost
和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. 我正在使用支持库。
谢谢!
答案 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);
}
}
}
这里有几个关键点:
使用FragmentContainer.class初始化第三个选项卡,并提供C.class作为片段参数。 (参数键为PARAM_CONTENT_FRAGMENT)
onCreateView() 只需创建一个id为+ + id / fragment_content的FrameLayout,这就是我们放置子片段的地方。
的onResume() 如果不存在,将子片段放入FrameLayout。
replaceContent() 调用此方法当Fragment-C想要将其自身更改为Fragment-D时。
在Frament-C中,例如:
((FragmentContainer)getParentFragment() ).replaceContent( D.class, null );