2016-06-20 23 views
2

Ich habe ein Problem mit meinem ViewPager und Fragmenten, die es enthält. Ich habe 2 Menüs (A und B), meine Homepage ist direkt A. Wenn ich auf ein Menü B klicke, das ein TabLayout enthält, enthält ein ViewPager selbst drei Fragmente (jeweils enthält ein einfaches TextView mit Lorem ipsum). Die 3 Fragmente von ViewPager sind korrekt, aber wenn ich auf das Menü A klicke und ich erneut auf das Menü B klicke, habe ich keinen Inhalt. Nichts an den Fragmenten 1 und 2 gegen das 3. hat noch den Text und wenn ich zu Fragment 1 zurückkomme, liest sich Einkommen (für nichts gegen das Fragment 2).TabLayout - ViewPager - Fragment

Hier ist mein Code:

Menü B (FragmentTabLayout)

public class TabLayoutFragment extends Fragment { 
 

 
    private static final String ARG_TEXT = "ARG_TEXT"; 
 
    private static final String ARG_COLOR = "ARG_COLOR"; 
 

 
    private Toolbar toolbar; 
 
    private TabLayout tabLayout; 
 
    private ViewPager viewPager; 
 

 
    public TabLayoutFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 
    public static TabLayoutFragment newInstance(String text, int color) { 
 
     Bundle args = new Bundle(); 
 
     args.putString(ARG_TEXT, text); 
 
     args.putInt(ARG_COLOR, color); 
 

 
     TabLayoutFragment tabLayoutFragment = new TabLayoutFragment(); 
 
     tabLayoutFragment.setArguments(args); 
 

 
     return tabLayoutFragment; 
 
    } 
 

 

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

 
     setHasOptionsMenu(true); 
 
     // Inflate the layout for this fragment 
 
     View view = inflater.inflate(R.layout.fragment_tab_layout, container, false); 
 

 
     toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
 
     ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); 
 
     toolbar.setBackgroundColor(getArguments().getInt(ARG_COLOR)); 
 
     toolbar.setTitle(getArguments().getString(ARG_TEXT)); 
 

 
     viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
 
     setupViewPager(viewPager); 
 

 

 
     tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
 
     tabLayout.setupWithViewPager(viewPager); 
 
     tabLayout.setBackgroundColor(getArguments().getInt(ARG_COLOR)); 
 
     tabLayout.setSelectedTabIndicatorColor(Color.WHITE); 
 
     
 

 
     return view; 
 
    } 
 

 
    @Override 
 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
 
     inflater.inflate(R.menu.tab_menu, menu); 
 
     super.onCreateOptionsMenu(menu, inflater); 
 
    } 
 

 
    private void setupViewPager(ViewPager viewPager) { 
 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager()); 
 
     viewPager.setAdapter(adapter); 
 
    } 
 

 
    class ViewPagerAdapter extends FragmentPagerAdapter { 
 

 
     //private final List<TabFragment> mFragmentList = new ArrayList<>(); 
 
     //private final List<String> mFragmentTitleList = new ArrayList<>(); 
 

 
     public ViewPagerAdapter(FragmentManager manager) { 
 
      super(manager); 
 
     } 
 
     
 
     @Override 
 
     public Fragment getItem(int position) { 
 
      switch (position) { 
 
       case 0: 
 
        return TabFragment.newInstance("Fragment 2-1"); 
 
       case 1: 
 
        return TabFragment.newInstance("Fragment 2-2"); 
 
       case 2: 
 
        return TabFragment.newInstance("Fragment 2-3"); 
 
       default: 
 
        return TabFragment.newInstance("Fragment Default"); 
 
      } 
 
     } 
 

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

Fragment in ViewPager:

public class TabFragment extends Fragment { 
 

 
    private static final String ARG_TEXT = "ARG_TEXT"; 
 

 
    private TextView tv; 
 

 
    public TabFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 
    public static TabFragment newInstance(String text) { 
 
     Bundle args = new Bundle(); 
 
     args.putString(ARG_TEXT, text); 
 

 
     TabFragment tabFragment= new TabFragment(); 
 
     tabFragment.setArguments(args); 
 

 
     return tabFragment; 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     // Inflate the layout for this fragment 
 
     View view = inflater.inflate(R.layout.fragment_tab, container, false); 
 

 
     tv = (TextView) view.findViewById(R.id.tv); 
 

 
     return view; 
 
    } 
 

 
}

Layout-FragmentTabLayout:

<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:orientation="vertical"> 
 

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

 
     <android.support.v7.widget.Toolbar 
 
      android:id="@+id/toolbar" 
 
      android:layout_width="match_parent" 
 
      android:layout_height="?attr/actionBarSize" 
 
      android:background="?attr/colorPrimary" 
 
      app:layout_scrollFlags="scroll|enterAlways" 
 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 
 

 
     <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" 
 
     /> 
 

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

Layout tabFragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
 
    android:orientation="vertical" 
 
    tools:context="com.application.myapplication.TabFragment"> 
 

 
    <android.support.v4.widget.NestedScrollView 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
 
     > 
 

 
    <TextView 
 
     android:id="@+id/tv" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:text="@string/lorem_ipsum" 
 
     /> 
 

 
    </android.support.v4.widget.NestedScrollView> 
 

 
</LinearLayout>

+0

Überprüfen Sie diese http://www.gadgetsaint.com/android/create-viewpager-tabs-android/#.WPuppVN97BI – ASP

Antwort

1

Sie können sich Ihre ViewPagerAdapter

FragmentStatePagerAdapter 

statt

FragmentPagerAdapter 

ich gleiche Problem haben und es funktioniert für mich.

+0

Thx Roman für diese gute Antwort, aber ich frage mich meine zukünftige Verwendung meines Fragments, das ein enthalten wird Viele Daten (GridLayout) mit Bildern und Text. – GJer

0

meiner Meinung nach die bessere Lösung ist, sollten Sie versuchen childFragmentManager für verschachtelte Fragmente

Hier ist die einfache Beispiel mit:

private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getChildFragmentManager()); 
     viewPager.setAdapter(adapter); 
    } 

Hoffentlich ist es Ihr Problem lösen wird.

Verwandte Themen