Je dois placer un ViewPager à l'intérieur d'un fragment, mais j'ai deux fragments, le fragment 1 est mon MENU et le fragment 2 que je souhaite utiliser comme ViewPagerIndicator.
Mais un fragment ne peut pas avoir un autre fragment ... que dois-je faire pour cela?
Depuis Android 4.2, il existe des fragments imbriqués. http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments La bibliothèque de support inclut désormais le support pour cela dans les anciennes versions Android.
Donc, vous pouvez faire quelque chose comme ça:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
mViewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
}
La mise en œuvre complète est disponible ici: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments
Vous devez utiliser getChildFragmentManager()
au lieu de getSupportFragmentManager()
pour obtenir FragmentManger
à l'intérieur d'un fragment . Mais vous ne devez pas utiliser FragmentStatePagerAdapter
plutôt que FragmentPagerAdapter
.
c'est possible. essayez de faire ce fichier code view_pager_fragment.xml
<Android.support.design.widget.AppBarLayout
Android:id="@+id/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/tab"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</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" />
ViewPagerFragment
ViewPager viewPager;
TabLayout tabLayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tracks, container, false);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
tabLayout = (TabLayout) view.findViewById(R.id.tab);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());``
viewPagerAdapter.addFragment(new FirstFragment(), "First");
viewPagerAdapter.addFragment(new SecoundFragment(), "Secound");
viewPagerAdapter.addFragment(new LoginFragment(), "Login");
viewPager.setAdapter(viewPagerAdapter);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragmentList = new ArrayList<>();
List<String> fragmentTitles = new ArrayList<>();
public ViewPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentTitles.get(position);
}
public void addFragment(Fragment fragment, String name) {
fragmentList.add(fragment);
fragmentTitles.add(name);
}
}
Avec la bibliothèque Android Support V4, vous pouvez ajouter un fragment dans un autre fragment. Essayez de l'utiliser, cela peut résoudre votre problème.
Après avoir lu quelques exemples, vous ne pouvez pas avoir FragmentActivity à l'intérieur de fragmentActivity . Il n'est pas nécessaire d'avoir deux fragments et il doit s'agir d'un FragmentPageAdapter ... je n'ai qu'à faire cela.
<Android.support.v4.view.ViewPager
Android:id="@+id/pager"
Android:layout_width="match_parent"
Android:layout_height="0px"
Android:layout_weight="1" >
</Android.support.v4.view.ViewPager>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0"
Android:gravity="center"
Android:measureWithLargestChild="true"
Android:orientation="horizontal" >
<Button
Android:id="@+id/first"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="First" >
</Button>
<Button
Android:id="@+id/last"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Last" >
</Button>
</LinearLayout>
Source: http://www.truiton.com/2013/05/Android-fragmentpageradapter-example/
Utilisez simplement getChildFragmentManager () au lieu de getSupportFragmentManager () dans des fragments.
new ViewPagerAdapter(getChildFragmentManager());
new ViewPagerAdapter(getSupportFragmentManager());
fragment_sample.xml
layout<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<com.google.Android.material.tabs.TabLayout
Android:id="@+id/tablayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:layout_weight="1" />
</LinearLayout>
SampleFragment.Java
classepublic class SampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_sample, container, false);
return fragmentView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// find views by id
ViewPager viewPager = view.findViewById(R.id.viewpager);
TabLayout tabLayout = view.findViewById(R.id.tablayout);
// attach tablayout with viewpager
tabLayout.setupWithViewPager(viewPager);
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
// add your fragments
adapter.addFrag(new SampleFragment(), "Tab1");
adapter.addFrag(new SampleFragment2(), "Tab2");
adapter.addFrag(new SampleFragment3(), "Tab3");
// set adapter on viewpager
viewPager.setAdapter(adapter);
}
}
ViewPagerAdapter.Java
classepublic class ViewPagerAdapter extends FragmentStatePagerAdapter {
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();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
public void addFrag(Fragment fragment) {
mFragmentList.add(fragment);
mFragmentTitleList.add("");
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
}
Liens connexes importants