2017-07-19 2 views
0

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é:

  1. Moved toute la configuration du téléavertisseur et l'adaptateur sur le thread d'interface utilisateur

  2. seulement créer et définir un nouvel adaptateur lorsque l'adaptateur de courant est nul

  3. OnViewCreated appel _adapter.NotifyDataSetChanged()

  4. Avec 3 j'ai également fait un remplacement sur GetItemPosition dans l'adaptateur et retourné PositionNone pour recharger tous les éléments.

  5. 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

  6. 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; 
} 

Répondre

0

Donc, la question est que j'utilisais l'FragmentManager de l'activité qui abritait à la place du fragment du ChildFragmentManager dans le fragment.

Informations utiles de this answer