J'ai un problème avec les onglets dans Android en utilisant Xamarin et MvvmCross. Au premier démarrage, tout fonctionne parfaitement, le problème se produit lorsque je m'éloigne et que je reviens. Lorsque je reviens au fragment qui contient la mise en page de l'onglet, il est vide, jusqu'à ce que je commence à balayer, puis les pages sont créées à nouveau.MvvmCross Tabs dans fragment pause sur la navigation
Cela semble indiquer qu'il peut être résolu en appelant simplement Adapter.NotifyDataSetChanged() mais ce n'est pas le cas. Le même code qui s'exécute la première fois que je le crée s'exécute également lorsque je retourne à la vue. La seule différence étant que ma MainView ne contient pas les onglets, c'est l'un des fragments enfant qui est placé dans ce FragmentFrame qui contient la disposition des onglets.
Ma configuration
La configuration Fragment Android de base en utilisant Xamarin et MvvmCross. J'ai une vue de récipient avec un cadre de fragment dedans. Tous mes fragments sont MvxFragments avec l'attribut qui y est associé qui indique le viewmodel qui les contient ainsi que l'identifiant du cadre dans lequel ils doivent être placés. J'utilise le paramètre AndroidFragmentPresenter par défaut.
Est-ce que quelqu'un a déjà vécu cela? Voici quelques choses que j'ai essayé:
Moved toute la configuration du téléavertisseur et l'adaptateur sur le thread d'interface utilisateur
seulement créer et définir un nouvel adaptateur lorsque l'adaptateur de courant est nul
OnViewCreated appel _adapter.NotifyDataSetChanged()
Avec 3 j'ai également fait un remplacement sur GetItemPosition dans l'adaptateur et retourné PositionNone pour recharger tous les éléments.
Définir l'index de page à un autre indice sur le retour à la force un rouleau, mais je n'ai 3 pages pour celui du milieu est jamais créé à nouveau
Disposé viewPager, adaptateur et tabLayout sur DestroyView
EDIT 1: J'ai ajouté un exemple du scénario exact here Ceci est une version simplifiée de mon code de production. Lorsque vous appuyez sur le bouton FAB et utilisez le bouton de retour pour revenir en arrière, vous verrez que l'adaptateur d'onglet est vide. Et c'est le bug.
Je vais ajouter mon code aussi, vous ne voulez pas regarder ce repo.
Fragment avec des onglets (mise en page)
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_margin="10dp"
android:gravity="center">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/simple_search_edit_text"
android:layout_width="match_parent"
android:layout_height="60dp"
android:paddingLeft="70dp"
android:hint="New Search"
android:textColorHint="@color/light_grey"
android:background="#fff"
android:imeOptions="actionSearch"
android:inputType="text"
local:MvxBind="Text SearchText" />
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_centerVertical="true"
android:padding="3dp"
local:srcCompat="@drawable/mag_glass_gray" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginRight="20dp"
android:padding="8dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
local:srcCompat="@drawable/general_cog_icon" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<android.support.design.widget.TabLayout
android:id="@+id/main_tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SampleTabsTabLayout" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/main_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
local:layout_behavior="@string/appbar_scrolling_view_behavior" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/simple_search_advanced_search_btn"
android:layout_width="wrap_content"
android:layout_height="@dimen/simplesearch_advancedsearch_height"
android:layout_marginBottom="@dimen/simplesearch_advanced_search_margin_bottom"
android:layout_above="@+id/simple_search_fab"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textSize="@dimen/simplesearch_advanced_search_text_size"
android:textColor="@color/foundit_blue"
android:background="@android:color/transparent"
local:MvxBind="Click AdvancedSearchCommand; Text AdvancedSearchButtonText" />
<!-- Search Button -->
<android.support.design.widget.FloatingActionButton
android:id="@+id/simple_search_fab"
android:layout_width="@dimen/general_fab_dimensions"
android:layout_height="@dimen/general_fab_dimensions"
android:layout_marginBottom="@dimen/general_fab_margin_bottom"
android:padding="@dimen/simplesearch_fab_icon_padding"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:scaleType="centerInside"
android:src="@drawable/general_search_icon"
local:MvxBind="Click SearchCommand" />
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
Fragment Afficher le code
// Pager and adapter setup
var fragments = GetTabFragments();
var presenter = Mvx.Resolve<IMvxAndroidViewPresenter>() as AndroidViewPresenter;
_adapter = new SimpleSearchTabAdapter(Context, presenter.FragmentManager, fragments);
_fragmentPager.Adapter = _adapter;
_tabLayout.SetupWithViewPager(_fragmentPager);
// Just for completion sake of the code above
private List<MvxCachingFragmentStatePagerAdapter.FragmentInfo> GetTabFragments()
{
var fragments = new List<MvxCachingFragmentStatePagerAdapter.FragmentInfo>();
foreach (var tabViewModel in ViewModel.TabViewModels)
fragments.Add(new MvxCachingFragmentStatePagerAdapter.FragmentInfo(GetTabNameFromViewModel(tabViewModel),
GetViewTypeFromViewModel(tabViewModel),
tabViewModel));
return fragments;
}