English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Szenario: Die Verwendung von Fragment für die Umsetzung von Seitenwechseln.
Klassendiagramm:
Eins: Activity
In der Activity wird getSupportFragmentManager().beginTransaction() verwendet, um ein Fragment (den verwaltenden FragmentA) zu füllen
Teil des Codes der Activity:
FragmentA fragment = FragmentA.newInstant(null); getSupportFragmentManager().beginTransaction().add(R.id.f_tab_fragment,fragment).commit();
XML:
<FrameLayout android:id="@"+id/fl_container" android:layout_width="match_parent" android:layout_above="@"+id/f_tab_fragment" android:layout_height="match_parent"/> <FrameLayout android:id="@"+id/f_tab_fragment" android:layout_width="match_parent" android:layout_height="52dp" android:layout_alignParentBottom="true"/>
Zwei: FragmentA
Laden Sie ein Hauptfragment FragmentA, um andere Unterblätter FragmentX zu verwalten.
Jetzt zum Beispiel gibt es zwei Unterblätter FragmentB und FragmentC.
FragmentA verwendet FragmentManager und FragmentTransaction, um den Wechsel zwischen FragmentB und FragmentC zu verwalten
FragmentA Code:
public class FragmentA extends BaseFragment { private static final String TAB_HOME = com.timediffproject.module.home.MyMainFragment.class.getName(); private static final String TAB_TEST = com.timediffproject.module.home.TestFragment.class.getName(); private BaseFragment mLastShowFragment; private static TabFragment fragment; public static TabFragment newInstant(Bundle bundle){ if (fragment == null) { fragment = new TabFragment(); fragment.setArguments(bundle); } return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initTabInfo(); } private void initTabInfo(){ FragmentManager fm = getFragmentManager(); if (fm == null) { return; } FragmentTransaction ft = fm.beginTransaction(); BaseFragment home = (BaseFragment) fm.findFragmentByTag(TAB_HOME); if (home != null){ ft.hide(home); } BaseFragment test = (BaseFragment) fm.findFragmentByTag(TAB_TEST); if (test != null){ ft.hide(test); } ft.commit(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_tab, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); view.findViewById(R.id.btn_change_home).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { switchTo(TAB_HOME, null); } }); view.findViewById(R.id.btn_change_test).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { switchTo(TAB_TEST, null); } }); switchTo(TAB_HOME, null); } //切换Fragment的方式(FragmentB、FragmentC) //tab是Fragment的类名(例如:FragmentB.class.getName()) //R.id.fl_container位于Activity的布局中,而不是FragmentA的布局中 private void switchTo(String tab, Bundle bundle) { //初始化管理Fragment的类 FragmentManager fm = getFragmentManager(); if (fm == null) { return; } FragmentTransaction ft = fm.beginTransaction(); //从FragmentManager中寻找名为tab的Fragment BaseFragment fragment = (BaseFragment) fm.findFragmentByTag(tab); if (fragment == null) { fragment = (BaseFragment) Fragment.instantiate(getActivity(), tab); fragment.setArguments(bundle); ft.add(R.id.fl_container, fragment, tab); } else { ft.show(fragment); } //Verstecke den derzeit angezeigten Fragment if (mLastShowFragment != null) { ft.hide(mLastShowFragment); } //Letzten Klick auf Fragment aufzeichnen mLastShowFragment = fragment; ft.commitAllowingStateLoss(); } }
XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="52dp"> <Button android:id="@"+id/btn_change_home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Wechsel home" /> <Button android:id="@"+id/btn_change_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Wechsel test" /> </LinearLayout>
Drei: FragmentX (FragmentB, FragmentC)
Die Logik der Unterseiten muss je nach spezifischer Geschäftsanwendung selbst definiert werden und wird wie ein gewöhnlicher Fragment implementiert.
Beispiel:
public class TestFragment extends BaseFragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_test,container,false);} } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } }
到这里,就可以简单地实现了-使用底部Tab切换Fragment实现切页的功能
附图:
PS: 实现过程中出现的错误
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
正确方式:相关的fragment的初始化布局应该加上false,与父类布局建立关系。
原因:如果不加,这个inflater出来的view系统会绑定一个未知父类,这时候当你把这个fragment又作为子页绑定给Activity或者另一个fragment时,就会出现以上错误。
@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //这里正确的写法是: //return inflater.inflate(R.layout.fragment_test, container, false); return inflater.inflate(R.layout.fragment_test, container); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来自网络,版权归原作者所有。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#w。3声明:本文内容来自网络,版权属于原作者。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,请发送邮件至:notice#w 进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。