【问题标题】:Fragment replaced by another Fragment in an Activity, how to navigate?Activity 中的 Fragment 被另一个 Fragment 替换,如何导航?
【发布时间】:2018-03-07 09:06:40
【问题描述】:

我正在使用 NavigationDrawer 和一个 Activity 来替换 FrameLayout 中的片段。在 NavigationDrawer 中导航并替换 Activity 中的 Fragments 非常简单。当我从另一个 Fragment 替换 Fragment 时,我不确定如何处理。示例:

我展示了一个基本列表的片段,当用户点击其中一个项目时,我展示了一个新的片段。现在,从这个新的 Fragment 中,我可以选择显示另一个 Fragment,这会导致更深的 Fragment 层次结构。我知道我可以通过 .addToBackStack(),如果是返回按钮,调用

if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }

来自 Activity,但随着 Fragment 层次结构越深,它变得越复杂和肮脏。有没有好的文章或架构方法来处理这样的案例?

【问题讨论】:

  • 你想替换或者还想跟踪片段的堆栈

标签: android android-fragments architecture navigation-drawer


【解决方案1】:

在您的场景中,您应该使用嵌套片段。 您可以在片段中嵌入片段。

要嵌套片段,只需在要添加片段的Fragment 上调用getChildFragmentManager()。这将返回一个FragmentManager,您可以像往常一样从顶级活动中使用它来创建片段事务。例如,下面是一些从现有 Fragment 类中添加片段的代码:

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

在嵌套的fragment中,你可以通过调用getParentFragment().来获取对父fragment的引用,然后你的父backstack和子backstack将被分开。

这是正确的做法。另一个问题是也许你应该考虑使用intent 和新活动而不是 10 个嵌套片段?这是一篇关于子片段的文章。link Stack similar question

【讨论】:

    【解决方案2】:

    在您的主要活动中制作片段标签:

     //----------------Fragment TAGS-----------------------\\
        private final String FRAGMENT_BOOK_RIDE = "Frag Book Ride";
        private final String FRAGMENT_RIDE_HISTORY = "Frag Ride History";
        private final String FRAGMENT_PAYMENT = "Frag Payment";
        private final String FRAGMENT_PROFILES_SETTINGS = "Frag Profile & Settings";
        private final String FRAGMENT_HELP = "Frag Help";
        //-----------------------------------------------------\\
    

    导航项选择:

    @SuppressWarnings("StatementWithEmptyBody")
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here. \\
            int id = item.getItemId();
    
            switch (id) {
                case R.id.nav_book_ride:
                    removeAllFragments();
                    getSupportActionBar().setTitle(getResources().getString(R.string.app_name));
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container_fl, new BookRideFragment(getApplicationContext())
                                    , FRAGMENT_BOOK_RIDE)
                            .commit();
                    break;
                case R.id.nav_ride_history:
                    removeAllFragments();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container_fl, new RideHistoryFragment(getApplicationContext())
                                    , FRAGMENT_RIDE_HISTORY)
                            .commit();
                    break;
                case R.id.nav_payment:
                    removeAllFragments();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container_fl, new PaymentFragment(getApplicationContext())
                                    , FRAGMENT_PAYMENT)
                            .commit();
                    break;
                case R.id.nav_settings:
                    removeAllFragments();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container_fl, new ProfileSettingFragment(getApplicationContext())
                                    , FRAGMENT_PROFILES_SETTINGS)
                            .commit();
                    break;
                case R.id.nav_help:
                    removeAllFragments();
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container_fl, new HelpFragment(getApplicationContext())
                                    , FRAGMENT_HELP)
                            .commit();
                    break;
            }
    
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }
    

    处理后退按键:

    @Override
        public void onBackPressed() {
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {
                backKeyMethods();
            }
        }
    
        /**
         * Custom back key method for managing fragment back key behavior
         */
        private void backKeyMethods() {
            RideHistoryFragment rideHistoryFragment = (RideHistoryFragment) getSupportFragmentManager().
                    findFragmentByTag(FRAGMENT_RIDE_HISTORY);
            PaymentFragment paymentFragment = (PaymentFragment) getSupportFragmentManager().
                    findFragmentByTag(FRAGMENT_PAYMENT);
            HelpFragment helpFragment = (HelpFragment) getSupportFragmentManager().
                    findFragmentByTag(FRAGMENT_HELP);
            ProfileSettingFragment userProfileFragment = (ProfileSettingFragment) getSupportFragmentManager().
                    findFragmentByTag(FRAGMENT_PROFILES_SETTINGS);
    
            if (rideHistoryFragment != null && rideHistoryFragment.isVisible()) {
                navigationView.setCheckedItem(R.id.nav_book_ride);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container_fl, new BookRideFragment(getApplicationContext())
                                , FRAGMENT_BOOK_RIDE)
                        .commit();
            } else if (paymentFragment != null && paymentFragment.isVisible()) {
                navigationView.setCheckedItem(R.id.nav_book_ride);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container_fl, new BookRideFragment(getApplicationContext())
                                , FRAGMENT_BOOK_RIDE)
                        .commit();
            } else if (userProfileFragment != null && userProfileFragment.isVisible()) {
                navigationView.setCheckedItem(R.id.nav_book_ride);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container_fl, new BookRideFragment(getApplicationContext())
                                , FRAGMENT_BOOK_RIDE)
                        .commit();
            } else if (helpFragment != null && helpFragment.isVisible()) {
                navigationView.setCheckedItem(R.id.nav_book_ride);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container_fl, new BookRideFragment(getApplicationContext())
                                , FRAGMENT_BOOK_RIDE)
                        .commit();
            } else if (getFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    
        /**
         * Remove all fragments in Fragment BackStack
         */
        private void removeAllFragments() {
            FragmentManager fm = getSupportFragmentManager();
            for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
                fm.popBackStack();
            }
        }
    

    只要你想深入,就使用 addToBackStack(null),所以当你按下 backKey 时,它会立即弹出片段。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多