1

J'utilise un FragmentPagerAdapter pour créer un viewpager de 3 pages et jusqu'à ce que je mette à jour vers sdk 23 cela a bien fonctionné. J'utilise un fragment et j'envoie des arguments différents en fonction du getItem (position) pour remplir différentes données. Après la mise à niveau Android ne reconnaît pas l'une des pages et je dois aller à la position 2 (page 3), puis revenir à la position 0 (page 1), puis Android remplit la page avec les données correctes. L'exécution à travers le débogueur a confirmé qu'Android ignore le cas 2 dans la fonction getItem de TabAdapter.java. Je reçois aussi W/FragmentManager: moveToState: Fragment state for TabContentFragment{3ac2d125 #3 id=0x7f0f0097} not updated inline; expected state 3 found 2. J'ai utilisé this similar question as reference mais je n'arrivais toujours pas à le faire fonctionner mais j'ai coincé le problème au FragmentManager que j'utilise. Mais après de jouer avec elle pendant des heures, je ne l'ai pas été en mesure d'obtenir Android pour voir qu'il ya 3 pages non 2.FragmentManager Erreur après la mise à jour de sdk 22 à 23 sur Android

TabAdapter.java

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import com.movies.R; 
import com.movies.date.LiveStatus; 
import com.movies.fragments.TabContentFragment; 
import com.movies.fragments.TabFragment; 
import com.movies.utils.BundleKeys; 

public class TabAdapter extends FragmentPagerAdapter { 

private Context context; 

public TabAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    this.context = context; 
} 

/** 
* Return fragment with respect to Position . 
*/ 

@Override 
public Fragment getItem(int position) { 
    TabContentFragment fragment = new TabContentFragment(); 
    Bundle args = new Bundle(); 
    switch (position){ 
     case 0: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_STARTED); 
      break; 
     case 1: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_NOT_STARTED); 
      break; 
     case 2: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_OVER); 
      break; 
    } 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public int getCount() { 
    return TabFragment.MAX_TABS; 
} 

/** 
* This method returns the title of the tab according to the position. 
*/ 

@Override 
public CharSequence getPageTitle(int position) { 

    switch (position) { 
     case 0: 
      return this.context.getString(R.string.tab_title_live); 
     case 1: 
      return this.context.getString(R.string.tab_title_upcoming); 
     case 2: 
      return this.context.getString(R.string.tab_title_replay); 
     default: 
      return null; 
     } 
    } 
} 

Les données de paquet est tirée vers comme celui-ci

this.state = getArguments().getInt(BundleKeys.STATE_KEY); 

TabFragment.java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.movies.R; 
import com.movies.adapters.TabAdapter; 

public class TabFragment extends Fragment { 

public static final int MAX_TABS = 3; 
public static TabLayout tabLayout; 
public static ViewPager viewPager; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    /** 
    * Inflate tab_layout and setup Views. 
    */ 
    View view = inflater.inflate(R.layout.tab_layout, null); 
    tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
    viewPager = (ViewPager) view.findViewById(R.id.event_info_viewpager); 

    /** 
    * Set an Adapter for the View Pager 
    */ 
    viewPager.setAdapter(new TabAdapter(getFragmentManager(), getContext())); 

    /** 
    * Now , this is a workaround , 
    * The setupWithViewPager doesn't works without the runnable . 
    * Maybe a Support Library Bug . 
    */ 

    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 
    return view; 
    } 
} 

activité qui maintient le TabFragment commence Fragm ent comme ceci:

mFragmentManager = getSupportFragmentManager(); 
    mFragmentTransaction = mFragmentManager.beginTransaction(); 
    mFragmentTransaction.replace(R.id.container_view, new TabFragment()).commit(); 

Répondre

1

Je ne suis pas sûr si je comprends bien votre question ou non, mais il me semble que votre dernier onglet (troisième) n'est pas créé jusqu'à ce que vous naviguer vers elle.

Par défaut, ViewPager est limité à la création de seulement 2 vues hors écran (une à gauche et une à droite). Généralement, les applications démarrent dans l'onglet le plus à gauche, ce qui signifie que si vous en avez 3 au total, l'onglet le plus à droite ne sera pas créé tant que vous n'aurez pas navigué plus près.

Vous pouvez remplacer cette fonction dans MainActivity en utilisant ViewPager.setOffScreenPageLimit (#) où ViewPager est en fait le nom de votre ViewPager et # est le nombre d'onglets que vous voulez créer depuis le début. Dans votre cas, il semble que vous vouliez que ce numéro soit 2.

+0

lorsque l'application démarre, elle commence à la page 1 mais les informations qui devraient y figurer ne sont pas là mais si je balaye tout le chemin vers la droite (le dernière page) les informations de la dernière page s'affichent et lorsque je reviens à la page 1, les informations de la page 1 s'affichent. Et ce n'est pas un problème de latence de réseau parce que je laisserais l'application sur la page 1 pendant 5 minutes et rien ne se passera, puis je passerai à la page 3 et retournerai à la page 1 –

+0

Si vous pouvez afficher le code du fragment spécifique contrôleur, je peux y jeter un coup d'oeil. Utilisez-vous des asyncTasks sur votre premier fragment? –

+0

pas d'asynctasks en cours d'utilisation. la façon dont il démarre est lorsque l'activité d'hébergement commence tabfragment (voir en bas de la publication) TabFragment gonfle les vues et démarre le tabadapter qui démarre ensuite tabcontentfragment et transmet différentes données en fonction de la position de la page. –