news 2026/6/10 8:53:55

android中fragment demo举例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
android中fragment demo举例

好的,我来给你一个完整的Fragment Demo,从简单到复杂,并详细讲解每个部分。

一、最简单的Fragment Demo

1. 创建Fragment布局文件

res/layout/fragment_demo.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"android:gravity="center"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是Fragment"android:textSize="24sp"android:textColor="@android:color/black"/><Buttonandroid:id="@+id/btn_click"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="点击我"/></LinearLayout>

2. 创建Fragment类

DemoFragment.java

publicclassDemoFragmentextendsFragment{// 1. 创建Fragment实例的方法(推荐写法)publicstaticDemoFragmentnewInstance(){returnnewDemoFragment();}// 2. Fragment创建时调用(最早执行)@OverridepublicvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);// 初始化数据,不涉及UI}// 3. 创建视图(最重要的方法)@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){// 加载布局文件returninflater.inflate(R.layout.fragment_demo,container,false);}// 4. 视图创建完成后调用@OverridepublicvoidonViewCreated(@NonNullViewview,@NullableBundlesavedInstanceState){super.onViewCreated(view,savedInstanceState);// 找到控件并设置点击事件TextViewtvTitle=view.findViewById(R.id.tv_title);ButtonbtnClick=view.findViewById(R.id.btn_click);btnClick.setOnClickListener(v->{tvTitle.setText("按钮被点击了!");});}}

3. 在Activity中使用Fragment

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 方式1:通过标签静态添加Fragment --><fragmentandroid:id="@+id/fragment_static"android:name="com.example.DemoFragment"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><!-- 方式2:FrameLayout作为Fragment容器 --><FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><Buttonandroid:id="@+id/btn_add_fragment"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="动态添加Fragment"/></LinearLayout>

MainActivity.java

publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 动态添加FragmentButtonbtnAdd=findViewById(R.id.btn_add_fragment);btnAdd.setOnClickListener(v->{// 开始Fragment事务getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,newDemoFragment())// 替换容器内容.addToBackStack(null)// 加入返回栈.commit();// 提交事务});}}

二、带参数传递的Fragment Demo(实际开发常用)

1. 带参数的Fragment

UserDetailFragment.java

publicclassUserDetailFragmentextendsFragment{privateTextViewtvUserName,tvUserAge;// 定义参数keyprivatestaticfinalStringARG_USER_NAME="user_name";privatestaticfinalStringARG_USER_AGE="user_age";// 推荐:通过newInstance传递参数publicstaticUserDetailFragmentnewInstance(Stringname,intage){UserDetailFragmentfragment=newUserDetailFragment();// 使用Bundle传递参数Bundleargs=newBundle();args.putString(ARG_USER_NAME,name);args.putInt(ARG_USER_AGE,age);fragment.setArguments(args);// 设置参数returnfragment;}@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){returninflater.inflate(R.layout.fragment_user_detail,container,false);}@OverridepublicvoidonViewCreated(@NonNullViewview,@NullableBundlesavedInstanceState){super.onViewCreated(view,savedInstanceState);tvUserName=view.findViewById(R.id.tv_user_name);tvUserAge=view.findViewById(R.id.tv_user_age);// 获取传递的参数if(getArguments()!=null){Stringname=getArguments().getString(ARG_USER_NAME);intage=getArguments().getInt(ARG_USER_AGE);tvUserName.setText("姓名:"+name);tvUserAge.setText("年龄:"+age);}}}

2. 使用方式

// 在Activity或其他Fragment中UserDetailFragmentfragment=UserDetailFragment.newInstance("张三",25);getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment).commit();

三、Fragment与Activity通信的Demo

1. Fragment定义接口

CommunicationFragment.java

publicclassCommunicationFragmentextendsFragment{privateEditTextetInput;privateButtonbtnSend;privateOnDataSendListenerlistener;// 定义通信接口publicinterfaceOnDataSendListener{voidonDataSend(Stringdata);}// 绑定Activity时调用@OverridepublicvoidonAttach(@NonNullContextcontext){super.onAttach(context);// 检查Activity是否实现了接口if(contextinstanceofOnDataSendListener){listener=(OnDataSendListener)context;}else{thrownewRuntimeException("Activity必须实现OnDataSendListener");}}@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment_communication,container,false);etInput=view.findViewById(R.id.et_input);btnSend=view.findViewById(R.id.btn_send);btnSend.setOnClickListener(v->{Stringdata=etInput.getText().toString();if(listener!=null){listener.onDataSend(data);// 发送数据给Activity}});returnview;}}

2. Activity实现接口

MainActivity.java

publicclassMainActivityextendsAppCompatActivityimplementsCommunicationFragment.OnDataSendListener{privateTextViewtvReceived;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvReceived=findViewById(R.id.tv_received);// 添加Fragmentif(savedInstanceState==null){getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,newCommunicationFragment()).commit();}}@OverridepublicvoidonDataSend(Stringdata){// 接收Fragment发送的数据tvReceived.setText("收到:"+data);// 可以Toast提示Toast.makeText(this,"收到:"+data,Toast.LENGTH_SHORT).show();}}

四、Fragment生命周期详解

完整生命周期Demo

publicclassLifecycleDemoFragmentextendsFragment{privatestaticfinalStringTAG="LifecycleDemo";@OverridepublicvoidonAttach(@NonNullContextcontext){super.onAttach(context);Log.d(TAG,"1. onAttach - Fragment与Activity绑定");}@OverridepublicvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);Log.d(TAG,"2. onCreate - 创建Fragment,初始化数据");}@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){Log.d(TAG,"3. onCreateView - 创建视图");returninflater.inflate(R.layout.fragment_demo,container,false);}@OverridepublicvoidonViewCreated(@NonNullViewview,@NullableBundlesavedInstanceState){super.onViewCreated(view,savedInstanceState);Log.d(TAG,"4. onViewCreated - 视图已创建,可以操作UI");}@OverridepublicvoidonStart(){super.onStart();Log.d(TAG,"5. onStart - Fragment可见");}@OverridepublicvoidonResume(){super.onResume();Log.d(TAG,"6. onResume - Fragment获得焦点,可交互");}@OverridepublicvoidonPause(){super.onPause();Log.d(TAG,"7. onPause - Fragment失去焦点");}@OverridepublicvoidonStop(){super.onStop();Log.d(TAG,"8. onStop - Fragment不可见");}@OverridepublicvoidonDestroyView(){super.onDestroyView();Log.d(TAG,"9. onDestroyView - 销毁视图");}@OverridepublicvoidonDestroy(){super.onDestroy();Log.d(TAG,"10. onDestroy - 销毁Fragment");}@OverridepublicvoidonDetach(){super.onDetach();Log.d(TAG,"11. onDetach - Fragment与Activity解绑");}}

生命周期流程图

Activity创建 ↓ onAttach() ← Fragment与Activity绑定 ↓ onCreate() ← 初始化数据 ↓ onCreateView() ← 创建视图(返回View) ↓ onViewCreated()← 视图创建完成,操作UI ↓ onStart() ← Fragment可见 ↓ onResume() ← Fragment可交互 ↓ 【运行中】 ↓ onPause() ← 失去焦点(如另一个Activity弹窗) ↓ onStop() ← 完全不可见 ↓ onDestroyView()← 销毁视图 ↓ onDestroy() ← 销毁Fragment ↓ onDetach() ← 与Activity解绑

五、实际使用建议

1. Fragment最佳实践模板

publicclassBestPracticeFragmentextendsFragment{// 1. 使用newInstance传递参数publicstaticBestPracticeFragmentnewInstance(Stringparam){BestPracticeFragmentfragment=newBestPracticeFragment();Bundleargs=newBundle();args.putString("param",param);fragment.setArguments(args);returnfragment;}// 2. 声明View变量privateViewrootView;privateTextViewtvContent;@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){// 缓存Viewif(rootView==null){rootView=inflater.inflate(R.layout.fragment_best,container,false);}returnrootView;}@OverridepublicvoidonViewCreated(@NonNullViewview,@NullableBundlesavedInstanceState){super.onViewCreated(view,savedInstanceState);// 初始化控件tvContent=view.findViewById(R.id.tv_content);// 获取参数if(getArguments()!=null){Stringparam=getArguments().getString("param");tvContent.setText(param);}}// 提供更新UI的方法publicvoidupdateContent(StringnewContent){if(tvContent!=null){tvContent.setText(newContent);}}}

2. Fragment事务注意事项

// ✅ 正确:使用tag标记Fragment,避免重复添加Stringtag="demo_fragment";Fragmentfragment=getSupportFragmentManager().findFragmentByTag(tag);if(fragment==null){fragment=newDemoFragment();getSupportFragmentManager().beginTransaction().add(R.id.container,fragment,tag).commit();}// ✅ 正确:使用commitAllowingStateLoss()避免状态丢失异常getSupportFragmentManager().beginTransaction().replace(R.id.container,newFragment).commitAllowingStateLoss();// ❌ 错误:不要在onCreateView中操作FragmentTransaction// ✅ 正确:在Activity的onCreate中,或使用post延迟执行rootView.post(()->{getChildFragmentManager().beginTransaction()...});

总结要点

  1. 创建Fragment:继承Fragment,实现onCreateView
  2. 使用Fragment:通过FragmentTransactionadd/replace方法
  3. 传递参数:使用setArguments(Bundle),不要用构造方法
  4. 与Activity通信:定义接口,在onAttach中绑定
  5. 生命周期:理解11个生命周期方法,知道什么时候做什么
  6. 返回栈addToBackStack(null)可以让用户按返回键回到上一个Fragment
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:02:16

明日方舟终极自动化方案:MAA助手完整使用指南

明日方舟终极自动化方案&#xff1a;MAA助手完整使用指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/6/10 8:53:45

WeChatExporter:3步完成微信聊天记录备份,彻底告别数据丢失烦恼

WeChatExporter&#xff1a;3步完成微信聊天记录备份&#xff0c;彻底告别数据丢失烦恼 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾担心珍贵的微信聊天记录会…

作者头像 李华
网站建设 2026/6/8 4:59:28

JuiceFS 1.4|大规模元数据操作优化:批量删除、克隆与 Redis 缓存全解析

在 AI 训练、数据集管理等大规模文件访问场景中&#xff0c;随着文件数量和访问并发增加&#xff0c;元数据层往往更早成为性能瓶颈。无论是删除百万级小文件、克隆大规模数据集&#xff0c;还是高并发目录遍历&#xff0c;元数据引擎的响应能力都会直接影响上层业务效率。 Jui…

作者头像 李华
网站建设 2026/6/8 5:44:40

上海国际会展中心展会设计搭建公司推荐:高端品牌展会首选合作伙伴

2026 年上海国际会展中心&#xff08;上海世博展览馆、上海新国际博览中心、上海国家会展中心&#xff09;将举办进博会、上海车展、上海国际家具展等多个高端品牌展会&#xff0c;总展览面积超过 1000 万平方米&#xff0c;高端品牌对展会设计搭建的品质和服务提出了更高的要求…

作者头像 李华