0

Je travaille sur une application tiroir avec des fragments. Une des options dans les tiroirs appelle un fragment dans lequel j'ai mis en place une vue à onglets (avec des fragments) qui montrent des graphiques.Android ViewPager n'affiche pas le contenu après la première fois

Lorsque je lance l'application pour la première fois, mes onglets fonctionnent parfaitement bien, le contenu, le graphique et tout est génial.

Dès que je clique loin de ce fragment et que je passe à un autre fragment, et que je reviens, les onglets apparaissent avec les titres corrects, mais pas de contenu, pas de graphique.

Voici mon fragment principal qui met en place le viewpager:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 

public class StatsMain extends Fragment { 
    private ViewPagerAdapter adapter = null; 
    private TabLayout tabLayout = null; 
    private ViewPager viewPager = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    return inflater.inflate(R.layout.stats_main, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    tabLayout = (TabLayout) view.findViewById(R.id.tabs); 

    setupViewPager(viewPager); 
    tabLayout.setupWithViewPager(viewPager); 

} 

private void setupViewPager(ViewPager viewPager) { 
    adapter = new ViewPagerAdapter(getFragmentManager()); 
    adapter.addFragment(new Stats1(), "Stats 1"); 
    adapter.addFragment(new Stats2(), "Stats 2"); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 

Et voici ma disposition pour elle:

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="fixed" 
     app:tabGravity="fill"/> 
</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

C'est l'un de mes statistiques() fragments. Le second ressemble beaucoup:

public class Stats1 extends Fragment { 
GraphView graph; 
public Stats1() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 


    return inflater.inflate(R.layout.stats1, container, false); 

} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 
    Calendar calendar = Calendar.getInstance(); 
    Date d1 = calendar.getTime(); 
    calendar.add(Calendar.DATE, 1); 
    Date d2 = calendar.getTime(); 
    calendar.add(Calendar.DATE, 1); 
    Date d3 = calendar.getTime(); 
    calendar.add(Calendar.DATE, 1); 
    Date d4 = calendar.getTime(); 
    calendar.add(Calendar.DATE, 1); 
    Date d5 = calendar.getTime(); 

    graph = (GraphView) view.findViewById(R.id.graph); 
    StaticLabelsFormatter staticLabelsFormatter = new 
StaticLabelsFormatter(graph); 

    staticLabelsFormatter.setHorizontalLabels(new String[] {"old", "middle", "new"}); 

    graph.setTitle("Data History"); 
    LineGraphSeries<DataPoint> series = new LineGraphSeries<DataPoint>(new DataPoint[] { 
      new DataPoint(d1, 145.4), 
      new DataPoint(d2, 145.9), 
      new DataPoint(d3, 147.2), 
      new DataPoint(d4, 146.5), 
      new DataPoint(d5, 147.1) 
    }); 

    graph.getViewport().setScalable(true); 

    graph.addSeries(series); 
// set date label formatter 
    //graph.getGridLabelRenderer().setLabelFormatter(new 
DateAsXAxisLabelFormatter(this)); 
    graph.getGridLabelRenderer().setLabelFormatter(staticLabelsFormatter); 

    //graph.getGridLabelRenderer().setNumHorizontalLabels(6); // only 4 because of the space 
    series.setDrawDataPoints(true); 

// set manual x bounds to have nice steps 
    graph.getViewport().setMinX(d1.getTime()); 
    graph.getViewport().setMaxX(d5.getTime()); 
    graph.getViewport().setXAxisBoundsManual(true); 

// as we use dates as labels, the human rounding to nice readable numbers 
// is not necessary 
    graph.getGridLabelRenderer().setHumanRounding(false); 
} 

J'utilise appsthatmatter/GraphView à des fins graphiques.

J'ai essayé le débogage et j'ai découvert qu'après que je quittiez les onglets et revenir, la fonction:

@Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

ne sera pas appelé plus. Il fait deux fois la première fois mais il ne le fera jamais jusqu'à ce que je ferme correctement l'application et redémarre.

Quelqu'un peut-il m'aider à comprendre ce que je ne fais pas bien, s'il vous plaît?

Merci

Répondre

2

En fait, je l'ai corrigé. Je devais changer:

adapter = new ViewPagerAdapter(getFragmentManager()); 

à

adapter = new ViewPagerAdapter(getChildFragmentManager());