Android入门(10)| Fragment碎片详解

文章目录

  • 为什么要使用碎片(Fragment)
  • 实例
    • 布局文件
    • Fragment
    • Activity
  • 动态添加碎片
    • 布局文件
    • Fragment
    • Activity
  • 碎片通信
    • Fragment
    • 布局文件
    • Activity
  • 生命周期


为什么要使用碎片(Fragment)

我们在手机上看新闻可能是这样的:

  • RecyclerView 显示了一组新闻标题
  • 点击一个新闻后会跳转到新界面显示详细内容
    在这里插入图片描述
    但当设备屏幕很大时,我们完全可以将 RecyclerView详细内容 分别放在两个 碎片 中,然后引入同一个 活动
    在这里插入图片描述
    Fragment 的定义为小活动,同样具有生命周期,但比一个 Activity 更细化的管理空间。

实例

布局文件

定义两个布局文件:

left_fragment.xml

<LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Button"/></LinearLayout>

right_fragment.xml

<LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:background="#00ff00"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/tx1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="20sp"android:text="This is right fragment"/></LinearLayout>

fragment_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.activitytest.Fragment.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_fragment"android:name="com.example.activitytest.Fragment.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

Fragment

LeftFragment.java

public class LeftFragment extends Fragment {@Override// 重写Fragment中onCreateView方法public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.left_fragment, container, false);}
}

RightFragment.java

public class RightFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.right_fragment, container, false);}
}

Activity

FragmentActivity.java

public class FragmentActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_layout);}
}

运行结果:
在这里插入图片描述


动态添加碎片

Fragment 碎片的真正强大的地方在于可以在程序运行过程中动态地添加到活动中,下面将做一个点击按钮切换右边碎片的案例:

布局文件

rightfrag_two.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:background="#ffff00"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tx2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="This is another right fragment"/>
</LinearLayout>

修改 fragment_layout.xml,将右侧碎片替换成一个 FrameLayout 布局:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.activitytest.Fragment.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><!--<fragmentandroid:id="@+id/right_fragment"android:name="com.example.activitytest.Fragment.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>--><FrameLayoutandroid:id="@+id/right_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

Fragment

public class RightFragTwo extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.rightfrag_two, container, false);}
}

Activity

修改 FragmentActivity.java,实现通过点击 左侧 Button 按钮来动态替换 RightFragmentRightFragTwo 两个碎片:

public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {int type = 1; // 辅助判断当前right_layout的布局是RightFragment还是RightFragTwoprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_layout);Button button1 = findViewById(R.id.button_1); // fragment_layout.xml中replaceFragment(new RightFragment());button1.setOnClickListener(this);}private void replaceFragment(Fragment fragment){// 获取碎片管理器FragmentManager supportFragmentManager = getSupportFragmentManager();// 获取事务,beginTransaction开启一个事务FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();// 提供 容器id 和 待添加的碎片实例,实现像容器内动态替换碎片fragmentTransaction.replace(R.id.right_layout, fragment);// 提交事务fragmentTransaction.commit();}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_1:if(type == 1){replaceFragment(new RightFragTwo());type = 2;}else{replaceFragment(new RightFragment());type = 1;}break;}}
}

此时虽然实现了动态替换,但是会发现直接点击 Back 会退出程序,可以使用 fragmentTransaction.replace(R.id.right_fragment, fragment); 方法,它可以接受一个名字用于描述返回栈的状态,一般传入 null 即可:
在这里插入图片描述


碎片通信

碎片通信又可细分为 碎片和活动之间进行通信碎片和碎片之间通信。这里实现前者的一个实例:

Fragment

修改一下 RightFragment.java,在其中添加一个 TextView 成员,用于在其它类中管理 TextView 的内容:

public class RightFragment extends Fragment {public TextView textView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.right_fragment, container, false);textView = view.findViewById(R.id.tx1);return view;}
}

布局文件

left_fragment.xml 中再添加一个 button_2

    <Buttonandroid:id="@+id/button_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="send"/>

其作用是更改 RightFragment.javaTextView 的内容。为了实现这一功能,我们需要修改 FragmentActivity.java 文件:

Activity

创建 button_2 的实例 button2,并设置监听事件:
在这里插入图片描述
onClick 方法中完善点击 button2 之后的操作:
在这里插入图片描述

  • 通过 findFragmentById 方法获取并创建相应碎片的实例
  • 通过设置该实例更改 TextView 控件的内容

运行结果:
在这里插入图片描述


生命周期

碎片的生命周期内有四种状态:

  • 运行状态: 当一个碎片是可见的,并且所关联的活动也是正在处于运行状态的时候,该碎片处于运行状态。
  • 暂停状态: 当一个活动处于暂停状态时(另一个未占满屏幕的活动处于栈顶),与它相关联的可见碎片也处于暂停状态。
  • 停止状态: 当一个活动处于停止状态时,与它相关联的碎片也会进入到停止状态,或者调用了 FragmentTransactionremove()replace() 方法将碎片从活动中移除,并且在事务提交之前调用 addToBackStack() 方法,这时碎片也会进入到停止状态。进入到停止状态的碎片对用户来说是完全不可见的,也有可能会被系统回收。
  • 销毁状态: 当活动被销毁时,与它相关联的碎片也会进入到销毁状态,或者调用了 FragmentTransactionremove()replace() 方法将碎片从活动中移除,并且在事务提交之前没有调用 addToBackStack() 方法,碎片也会进入到销毁状态。

活动中有的回调方法碎片中几乎都有,且提供了一些附加的回调方法:

  • onAttach(): 当碎片和活动建立关联的时候调用
  • onCreateView(): 为碎片创建视图(加载布局)时调用
  • onActivityCreated(): 确保与碎片相关联的活动一定已经创建完毕的时候调用
  • onDestroyView(): 当与碎片关联的视图被移除的时候调用
  • onDetach(): 当碎片和活动解除关联的时候调用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…

Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录拍照并保存到 ImageView 控件布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作隐式 Intent 启动后的回调AndroidManifest.xml从相册选取照片并在 ImageView 控件中显示布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作自定义打开相册的方法 op…

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例VideoView类播放视频的实例MediaPlayer类 对多种格式的音频文件提供了全面的控制方法&#xff1a; 如何获得MediaPlayer实例&#xff1f; 通过构造函数&#xff1a; MediaPlayer mp new MediaPlayer();调用 MediaPlayer.create() 方法&…

Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnection使用OkHttp封装网络操作封装HttpURLConnection封装OkHttpWebView WebView 可以在 应用程序中&#xff08;而不是浏览器&#xff09; 展示一些网页。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask使用服务框架启动/停止服务绑定/解绑服务服务的生命周期前台服务IntentService完整版下载示例下载过程的回调接口&#xff1a;DownloadListener继承 AsyncTask 实现下载功能&#xff1a;Dow…

2020德勤面试开始了吗_2020国考面试开始,近期面试公告汇总,附结构化小组面试流程...

2020年国家公务员考试面试环节逐步恢复考试&#xff0c;各个招录部门已经发布面试考察公告&#xff0c;对于进入面试环节的国考考生来说&#xff0c;有必要了解近期国考面试的招录动态&#xff0c;提前做好面试准备。2020国考国家统计局机关面试面试确认&#xff1a;请进入面试…

项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

项目实施过程中&#xff0c;项目经理常常面临一个重大挑战——需求变更。需求变更无处不在&#xff0c;市场条件变化、新业务出现、战略目标调整、客户需求修改、资源限制等&#xff0c;都会造成需求变更。需求变更会影响项目的时间、成本和质量&#xff0c;对整个项目和团队成…

Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法

文章目录概述getOrientation 方法根据 旋转矩阵R 获取 设备旋转弧度getRotationMatrix 方法根据 地磁场、加速度传感器对象 获取 旋转矩阵R代码参考资料概述 Sensor.TYPE_ORIENTATION 常数在 API 8 中已弃用&#xff0c;官方推荐使用 SensorManager.getOrientation() 替代。关…

【JAVA 开发小问题】 | String操作合集

文章目录截取特定两个字符之间的字符串截取特定两个字符之间的字符串 利用正则表达式&#xff0c;图片来源

uniapp 刷新后数据都没有了_环境温度传感器都没有连接,竟然还会有数据?

福田欧曼GTL(福康发动机、康明斯2880系统)匹配ECoffit尿素泵●故障现象&#xff1a;OBD故障灯点亮&#xff0c;不烧尿素&#xff0c;油耗高&#xff0c;动力不足●故障码&#xff1a;●维修分析&#xff1a;①故障指出加热器问题&#xff0c;摸下尿素箱温度&#xff0c;发现烫手…

保姆级教学!Xcode 配置 OpenGL 环境

文章目录GLFW获取 GLFWGLAD获取 GLAD在 Xcode 中配置下载好的 GLFW 和 GLAD配置流程检测是否配置成功无关配置的题外话——Xcode 下安全的删除移动操作GLFW Graphics Library Framework&#xff08;图形库框架&#xff09;&#xff0c;可以让我们通过其封装好的 通用API 来正确…

Android入门(17)| 百度提供的 Android定位SDK

文章目录配置百度提供的 Android定位SDK用于发布的 SHA1用于测试的 SHA1使用百度定位实例配置百度提供的 Android定位SDK 详情参见官方文档&#xff0c;这里仅对获取 SHA1 做详细介绍&#xff1a; 用于发布的 SHA1 用于测试的 SHA1 使用百度定位实例 public class LocationAc…

ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...

关注风云之声提升思维层次导读说好的日环食呢&#xff0c;为什么上周很多人只等到了日偏食?日食月食的时间和种类是怎么预测的?你真的弄懂了各种日食和月食的成因吗&#xff1f;你了解它们有什么区别和联系&#xff0c;又遵循什么样的时间规律吗? 日食和月食发生的频率一样吗…

初识贝塞尔(bezier)曲线

文章目录资料援引贝塞尔曲线的用途一阶贝塞尔&#xff08;bezier&#xff09;曲线二阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔&#xff08;bezier&#xff09;曲线高阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔曲线求插值&#xff08;Slerp&#xff09…

python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

点击上方“Python编程时光”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;介绍无论你使用哪种编程语言或框架&#xff0c;测试都非常重要。Hypothesis是 Python 的一个高级测试库。它允许编写测试用例时参数化&#xff0c;然后生成使测试失败的简单易懂…