如何从一个片段切换到另一个片段。

3

我的应用程序中有一个带有一些片段的导航抽屉。当我在抽屉中选择时,我执行以下代码:

FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, f, tag);
ft.commit();

在MainActivity中。

现在,在一个Fragment中,我想在屏幕底部放置一个TabLayout,但是我遇到了以下问题:

  1. 是否可以从一个Fragment中替换到另一个Fragment?我应该把fragmentTransaction放在哪里?
  2. 如果我想调用第三个Fragment(例如,在这些选项卡Fragment之一的Send按钮中),我可以使用同样的选项卡函数吗?

谢谢你的回答。

5个回答

2
您可以这样做...
//when navigation item is selected by user
    @Override
    public void onDrawerItemSelected(View view, int position) {
        displayView(position);
    }

    public void displayView(int position) {
        String title = getString(R.string.app_name);
        switch (position) {
            case 0:
                fragment = new UserProjectListFragment();                    
                break;
            case 1:
                fragment = new ContactUsFragment();
                break;
            case 2:
                fragment = new HelpFragment();
                break;
            case 3:
                //and so on

                break;

            default:
                break;
        }
        if (fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container_body, fragment).addToBackStack("fragBack");
            fragmentTransaction.commit();
            // set the toolbar title
            getSupportActionBar().setTitle(title);
        }
    }

关于您的问题,是否可以从一个片段替换到另一个片段?我应该把fragmentTransaction放在哪里呢?是的,可以这样做:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

是的,我已经在onDrawerItemSelected()中完成了它。但我还有一个问题:例如,当我调用HelpFragment()时,我想要在其中放置一个具有3个片段(Home、Card、Map)的选项卡布局。我想知道如何在一个片段中管理这些选项卡。 - ste9206
所以,在类HelpFragment扩展Fragment中,我必须调用getChildFragmentManager(),是吗?而你可以执行transaction.replace().commit()吗? - ste9206
@ste9206,是的,我给你提供了经过测试的官方代码示例。 - Saurabh Vardani
@ste9206,很高兴为您服务...愉快的编程! - Saurabh Vardani
如果我想返回,我应该如何调用? - ste9206

1
你可以做类似这样的事情。
String cid=id.getText().toString();

 Fragment fr=new friendfragment();

 FragmentManager fm=getFragmentManager();

 android.app.FragmentTransaction ft=fm.beginTransaction();

 Bundle args = new Bundle();

 args.putString("CID", cid);

 fr.setArguments(args);

 ft.replace(R.id.content_frame, fr);

 ft.commit(); 

您可以接收数据

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("CID");    
    return inflater.inflate(R.layout.fragment, container, false);
}

0

如果您想要嵌套Fragment,则需要针对最低API级别17进行目标设置,从该版本开始支持。请参见此处


0

你可以像这样创建 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.design.widget.TabLayout
    android:id="@+id/pagerTabStrip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    app:tabIndicatorColor="?android:attr/textColorPrimary"
    app:tabIndicatorHeight="5dp"
    app:tabSelectedTextColor="?android:attr/textColorPrimary"
    app:tabTextColor="?android:attr/textColorPrimary" />

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后在你的Fragment中创建Pager Adapter:

PagerAdapter adapter = new PagerAdapter(getChildFragmentManager());
    mPagerTabStrip.setTabsFromPagerAdapter(adapter);
    mPagerTabStrip.setOnTabSelectedListener(new  TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
    mViewPager.setAdapter(adapter);
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mPagerTabStrip));

private class PagerAdapter extends FragmentPagerAdapter {
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;

    public PagerAdapter(FragmentManager fm) {
        super(fm);
        this.mFragmentManager = fm;
        mFragmentTags = new HashMap<>();
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new MyBookFragment();
        Bundle args = new Bundle();
        args.putInt("MyBookFragment", position);
        args.putInt("mSelectedPosition", mSelectedPosition);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object objects = super.instantiateItem(container, position);
        if (objects instanceof Fragment) {
            Fragment fragment = (Fragment) objects;
            String tag = fragment.getTag();
            mFragmentTags.put(position, tag);
        }
        return objects;
    }

    public Fragment getFragment(int position) {
        String tag = mFragmentTags.get(position);
        if (TextUtils.isEmpty(tag)) {
            return null;
        }
        return mFragmentManager.findFragmentByTag(tag);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return getString(R.string.now);
            default:
                return getString(R.string.my_book_reservation);
        }
    }
}

0

你可以尝试这个导航列表的东西,我认为对你有帮助。

navigation_list是Navigatindrawer上的listview

    navigation_list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {



                    switch (position) {
                    case 0:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new NewsDateFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;

                    case 1:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new NewsDateFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;
                    case 2:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new GossipDateFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;
                    case 3:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new StroriesFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;

                    case 4:

                        getSupportFragmentManager().beginTransaction()
                                .replace(R.id.frame_container, new LearnFragment())
                                .commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);

                        break;

                    case 5:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new WordsFocusFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;

                    case 7:

                        getSupportFragmentManager()
                                .beginTransaction()
                                .replace(R.id.frame_container,
                                        new SupportFragment()).commit();
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        break;

                    case 8:

                        // user.execute(user_id,intEventid);

                        session.logoutUser();

                        Intent i = new Intent(getApplicationContext(),
                                LoginActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);




                        mDrawerLayout.closeDrawer(Gravity.LEFT);

                        break;

                    }





        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接