English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сцена: использованиеFragment для реализации переключения страниц.
Структура класса:
Одно: Activity
ВActivity используетсяgetSupportFragmentManager().beginTransaction() для заполнения фрагмента (управляющего фрагментаFragmentA)
Часть кода 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"/>
Два: FragmentA
Загрузите фрагмент-родительFragmentA, чтобы управлять другими фрагментами-дочерямиFragmentX.
Теперь, например, есть два подфрагментаFragmentB иFragmentC.
FragmentA используетFragmentManager иFragmentTransaction для управления переключениемFragmentB иFragmentC
КодFragmentA:
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); } //Способ переключения фрагментов (FragmentB, FragmentC) //tab - это имя класса фрагмента (например: FragmentB.class.getName()) //R.id.fl_container находится в разметке Activity, а не в разметке FragmentA private void switchTo(String tab, Bundle bundle) { //Инициализация класса для управления фрагментами FragmentManager fm = getFragmentManager(); if (fm == null) { return; } FragmentTransaction ft = fm.beginTransaction(); //Поиск фрагмента с классом tab в менеджере фрагментов 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); } ft.show(fragment); } //Скрытие текущего отображаемого фрагмента if (mLastShowFragment != null) { ft.hide(mLastShowFragment); } //Записываем последний нажатый Fragment 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="Переключение home" /> <Button android:id="@+id/btn_change_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Переключение test" /> </LinearLayout>
Третий: FragmentX (FragmentB, FragmentC)
Логика подстраницы определяется конкретным бизнесом и реализуется так же, как и у обычного Fragmeng
Например:
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); } }
До этого момента можно просто реализовать функцию переключения страниц с помощью下部标签切换Fragment
Приложение:
PS: ошибки, возникшие в процессе реализации
java.lang.IllegalStateException: Указанный ребенок уже имеет родителя.你必须 сначала вызвать removeView() на родительском классе ребенка.
Правильный способ: инициализация макета соответствующего 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#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для жалоб, и предоставьте соответствующие доказательства. Если обнаружены факты, сайт немедленно удалят涉嫌侵权的内容。