#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 / … исходя из моего опыта, ваш дизайн в порядке.