【问题标题】:android, dynamically change a fragment inside a tabandroid,动态更改选项卡内的片段
【发布时间】:2013-02-15 01:31:05
【问题描述】:

我正在尝试更改使用 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。 我正在使用支持库。

谢谢!!

【问题讨论】:

    标签: android tabs android-tabhost


    【解决方案1】:

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

    例如:

    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. 替换内容() 当 Fragment-C 想要将自身更改为 Fragment-D 时调用此方法。

    在 Frament-C 中,例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多