Ich muss einen ViewPager in ein Fragment einfügen, aber ich habe zwei Fragmente: Fragment 1 ist mein MENÜ und Fragment 2, das ich als ViewPagerIndicator verwenden möchte.
Aber ein Fragment kann kein anderes Fragment haben ... was muss ich dafür tun?
Ab Android 4.2 gibt es verschachtelte Fragmente. http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments Die Support-Bibliothek unterstützt jetzt auch ältere Versionen von Android.
So kannst du so etwas machen:
@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()));
}
Vollständige Implementierung hier verfügbar: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments
Sie müssen getChildFragmentManager()
anstelle von getSupportFragmentManager()
verwenden, um die FragmentManger
in ein Fragment zu bekommen .__ Sie sollten jedoch FragmentStatePagerAdapter
nicht FragmentPagerAdapter
verwenden.
es ist möglich. Versuchen Sie, diese Code-Datei view_pager_fragment.xml auszuführen
<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);
}
}
Mit der Android Support V4-Bibliothek können Sie ein Fragment in ein anderes Fragment einfügen. Versuchen Sie es zu benutzen, es kann Ihr Problem lösen.
Nachdem Sie einige Beispiele gelesen haben, können Sie keine FragmentActivity in einer fragmentActivity . Haben. Es ist nicht erforderlich, zwei Fragmente zu haben, und dies muss ein FragmentPageAdapter sein ... ich muss dies nur tun.
<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>
Quelle: http://www.truiton.com/2013/05/Android-fragmentpageradapter-example/
Verwenden Sie einfach getChildFragmentManager () anstelle von getSupportFragmentManager () in 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
klassepublic 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
klassepublic 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);
}
}
Wichtige verwandte Links