2013-02-15 59 views
1

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

谢谢!

回答

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); 
+0

你能粘贴布局frag_container代码 – Arshu 2013-08-22 13:15:37