Android-实现切换Fragment页功能的实现代码
作者:冬瓜小生 时间:2023-05-06 12:28:49
场景:使用Fragment实现切页。
类结构:
一:Activity
Activity中使用getSupportFragmentManager().beginTransaction()来填充一个Fragment(管理用的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);
}
//切换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);
}
//隐藏现在正显示的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);
}
}
到这里,就可以简单的实现-用底部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);
}
来源:http://www.cnblogs.com/Sweet-Candy/p/6411105.html
标签:android,fragment
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于springboot的flowable工作流实战流程分析
2022-11-28 08:27:09
![](https://img.aspxhome.com/file/2023/3/64803_0s.png)
java中的常用集合类整理
2022-08-22 10:35:49
Android开发应用第一步 安装及配置模拟器Genymotion
2023-05-25 11:18:09
![](https://img.aspxhome.com/file/2023/4/91004_0s.png)
jtds1.1连接sqlserver2000测试示例
2021-06-13 04:57:28
Java实现接月饼小游戏的示例代码
2022-08-16 03:26:06
![](https://img.aspxhome.com/file/2023/9/86859_0s.jpg)
java servlet 几种页面跳转的方法
2023-08-02 18:12:07
基于Java Springboot + Vue + MyBatis实现音乐播放系统
2023-07-09 16:01:41
![](https://img.aspxhome.com/file/2023/1/106131_0s.png)
详解Android Activity中的几种监听器和实现方式
2022-11-02 11:26:05
Spring Cloud升级最新Finchley版本的所有坑
2021-09-02 07:21:51
![](https://img.aspxhome.com/file/2023/3/88593_0s.png)
Bean实例化之前修改BeanDefinition示例详解
2023-10-26 23:31:09
Java 反射类型Type的用法说明
2023-01-23 04:15:44
Java实现的两个线程同时运行案例
2023-05-14 09:10:40
![](https://img.aspxhome.com/file/2023/6/64106_0s.png)
浅谈mybatis中的#和$的区别 以及防止sql注入的方法
2023-03-24 10:22:28
Effective Java (异常处理)
2022-09-24 12:17:29
Java Spring MVC 上传下载文件配置及controller方法详解
2023-11-22 04:13:59
Android编程处理窗口控件大小,形状,像素等UI元素工具类
2022-04-06 04:47:53
android中Bitmap用法(显示,保存,缩放,旋转)实例分析
2022-07-03 14:18:41
Java动态代理分析及理解
2021-10-21 14:59:58
解决JSTL foEach标签 刷新报错的方法
2021-08-12 13:48:25
java读取xml配置参数代码实例
2023-11-25 03:03:17