Использование и замена нескольких видовых страниц для отображения фрагментов с вкладками

#android #android-fragments #xamarin.android #android-viewpager

#Android #android-фрагменты #xamarin.android #android-viewpager

Вопрос:

Этот вопрос больше касается оптимизации кода. В моем приложении отображаются 3 страницы просмотра. у каждой из них по 2 вкладки. каждый раз, когда я хочу отобразить фрагмент, который находится на другом viewpager, отличном от активного viewpager, я заменяю viewpager. Это хорошая идея? иногда я получаю задержку в 400 мс при замене. Должен ли я сделать что-то еще? Вот код, который заменяет видовые страницы:

 private void SetCurrentViewpager(PagerAdapterTypesEnum personTypesEnum = PagerAdapterTypesEnum.OddEven)
        {
            switch (personTypesEnum)
            {
                case PagerAdapterTypesEnum.OddEven:
                    if (CurrentViewPagerAdapter is PagerAdapterOddEven)
                        return;
                    CurrentTabLayout.RemoveAllTabs();
                    CurrentTabLayout.Visibility = ViewStates.Visible;
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.OddEven_ResultsTabTitle)));
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.OddEven_DelaysTabTitle)));
                    CurrentTabLayout.TabGravity = TabLayout.GravityFill;

                    CurrentViewPagerAdapter = new PagerAdapterOddEven
                        (SupportFragmentManager, CurrentTabLayout.TabCount);
                    CurrentViewPager.Adapter = CurrentViewPagerAdapter;

                    CurrentViewPager.AddOnPageChangeListener(null);
                    break;
                case PagerAdapterTypesEnum.Search:
                    if (CurrentViewPagerAdapter is PagerAdapterSearch)
                        return;
                    CurrentTabLayout.RemoveAllTabs();
                    CurrentTabLayout.Visibility = ViewStates.Visible;
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.Search)));
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.NumbersSearch_BonusAndFrequency)));
                    CurrentTabLayout.TabGravity = TabLayout.GravityFill;

                    CurrentViewPagerAdapter = new PagerAdapterSearch
                        (SupportFragmentManager, CurrentTabLayout.TabCount);
                    CurrentViewPager.Adapter = CurrentViewPagerAdapter;

                    CurrentViewPager.AddOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(CurrentTabLayout));
                    CurrentTabLayout.TabSelected  = (object sender, TabLayout.TabSelectedEventArgs e) =>
                    {
                        CurrentViewPager.SetCurrentItem(e.Tab.Position, true);
                    };
                    break;
                case PagerAdapterTypesEnum.Columns:
                    if (CurrentViewPagerAdapter is PagerAdapterColumns)
                        return;
                    CurrentTabLayout.RemoveAllTabs();
                    CurrentTabLayout.Visibility = ViewStates.Visible;
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.Columns_ColumnsStatistics)));
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.Columns_ColumnsResultsPerNumbers)));
                    CurrentTabLayout.TabGravity = TabLayout.GravityFill;

                    CurrentViewPagerAdapter = new PagerAdapterColumns
                        (SupportFragmentManager, CurrentTabLayout.TabCount);
                    CurrentViewPager.Adapter = CurrentViewPagerAdapter;

                    CurrentViewPager.AddOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(CurrentTabLayout));
                    CurrentTabLayout.TabSelected  = (object sender, TabLayout.TabSelectedEventArgs e) =>
                    {
                        CurrentViewPager.SetCurrentItem(e.Tab.Position, true);
                    };
                    break;
                case PagerAdapterTypesEnum.Settings:
                    if (CurrentViewPagerAdapter is PagerAdapterSettings)
                        return;
                    CurrentTabLayout.RemoveAllTabs();
                    CurrentTabLayout.Visibility = ViewStates.Visible;
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.Columns_ColumnsStatistics)));
                    CurrentTabLayout.AddTab(CurrentTabLayout.NewTab().SetText(GetString(Resource.String.Columns_ColumnsResultsPerNumbers)));
                    CurrentTabLayout.TabGravity = TabLayout.GravityFill;

                    CurrentViewPagerAdapter = new PagerAdapterSettings
                        (SupportFragmentManager, CurrentTabLayout.TabCount);
                    CurrentViewPager.Adapter = CurrentViewPagerAdapter;

                    CurrentViewPager.AddOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(CurrentTabLayout));
                    CurrentTabLayout.TabSelected  = (object sender, TabLayout.TabSelectedEventArgs e) =>
                    {
                        CurrentViewPager.SetCurrentItem(e.Tab.Position, true);
                    };

                    break;
            }
        }

public bool OnNavigationItemSelected(IMenuItem item)
        {
            int id = item.ItemId;
            DrawerLayout drawer = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);

            if (id == Resource.Id.Nav_DrawSearch)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.Search);
                CurrentTabLayout.GetTabAt(0).Select();
            }
            else if (id == Resource.Id.Nav_DrawsPerFrequency)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.Search);
                CurrentTabLayout.GetTabAt(1).Select();
            }
            else if (id == Resource.Id.Nav_OddEvenResults)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.OddEven);
                CurrentTabLayout.GetTabAt(0).Select();
            }
            else if (id == Resource.Id.Nav_OddEvenDelays)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.OddEven);
                CurrentTabLayout.GetTabAt(1).Select();
            }
            else if (id == Resource.Id.Nav_ColumnsStatistics)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.Columns);
                CurrentTabLayout.GetTabAt(0).Select();
            }
            else if (id == Resource.Id.Nav_ColumnsResultsPerNumbers)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.Columns);
                CurrentTabLayout.GetTabAt(1).Select();
            }
            else if (id == Resource.Id.Nav_Settings)
            {
                SetCurrentViewpager(PagerAdapterTypesEnum.Settings);
                CurrentTabLayout.GetTabAt(0).Select();
            }


            drawer.CloseDrawer(GravityCompat.Start);
            return true;
        }
  

Комментарии:

1. sometimes i get a 400ms delay on replacing. У вас много изображений или другого подключения к Интернету на этих страницах? И, пожалуйста, используйте Android-устройство для проведения теста, Android emualtor загружает фрагмент с задержкой 400 м, допустимая метка. Если у вас есть подключение к Интернету или вы загружаете данные, пожалуйста, используйте await/async .

2. Спасибо @Leon за комментарий. Я просто загружаю некоторые переменные из общих настроек. 400 мс на самом деле не проблема, если мой подход хорош. Меня больше беспокоило, был ли мой подход взломом и существовал ли другой, гораздо лучший способ.

3. ` загрузите некоторые переменные из общих настроек. ` Если вы хотите сохранить переменные в безопасном порядке, вы можете использовать learn.microsoft.com/en-us/xamarin/essentials / … исходя из моего опыта, ваш дизайн в порядке.