探究碎片Fragment(2)

2024-05-12 09:48
文章标签 fragment 探究 碎片

本文主要是介绍探究碎片Fragment(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 碎片的活动周期
  • 动态加载布局的技巧
  • 使用最小宽度限定符
  • 大神的博客

碎片的活动周期

活动中有的回调方法,碎片 中几乎都有,不过碎片还提供了一些附加的回调方法,那我们就重点来看下这几个回调

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

onAttach():

当Fragment和Activity相关联时调用可以通过该方法获取Activity引用,还可以通过getArguments()获取参数

onCreate():

当Fragment被创建时调用

onCreateView():

当Fragment的布局被创建时调用

onActivityCreated():

当Activity完成onCreate()时调用

onStart():

当Fragment可见时调用

onResume():

当Fragment可见且可交互时调用

onPause():

当Fragment不可交互但可见时调用

onStop():

当Fragment不可见时调用

onDestroyView():

当Fragment的从视图结构中移除时调用

onDestroy():

当销毁Fragment时调用

onDetach():

当Fragment和Activity解除关联时调用

在这里插入图片描述

在上一节的RightFragment的基础上修改

public class RightFragment extends Fragment {public static final String TAG = "RightFragment";@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);Log.d(TAG, "onAttach");}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d(TAG, "onCreateView");View view = inflater.inflate(R.layout.right_fragment, container, false);return view;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Log.d(TAG, "onActivityCreated");}@Overridepublic void onStart() {super.onStart();Log.d(TAG, "onStart");}@Overridepublic void onResume() {super.onResume();Log.d(TAG, "onResume");}@Overridepublic void onPause() {super.onPause();Log.d(TAG, "onPause");}@Overridepublic void onStop() {super.onStop();Log.d(TAG, "onStop");}@Overridepublic void onDestroyView() {super.onDestroyView();Log.d(TAG, "onDestroyView");}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}@Overridepublic void onDetach() {super.onDetach();Log.d(TAG, "onDetach");}
}

重新运行 程序,这时观察 LogCat中的打印信息
在这里插入图片描述

然后点击 LeftFragment中的按钮,此时打印信息

在这里插入图片描述
由于 AnotherRightFragment替换了 RightFragment,此时的 RightFragment进入了停止状 态,因此 onPause()onStop()onDestroyView()方法会得到执行。当然如果在替换的时候没 有调用 addToBackStack()方法,此时的 RightFragment 就会进入销毁状态,onDestroy()onDetach()方法就会得到执行

接着按下 Back键,RightFragment会重新回到屏幕
在这里插入图片描述
由于 RightFragment 重新回到了运行状态,因此onCreateViewonActivityCreated()onStart()onResume()方法会得到执行。注意此时 onCreate()方法并不会执行,因为我 们借助了 addToBackStack()方法使得 RightFragment和它的视图并没有销毁

再次按下 Back键退出程序
在这里插入图片描述
依次会执行 onPause()onStop()onDestroyView()onDestroy()onDetach()方法,最 终将活动和碎片一起销毁

动态加载布局的技巧

如果你经常使用平板电脑,应该会发现很多的平板应用现在都采用的是双页模式(程序 会在左侧的面板上显示一个包含子项的列表,在右侧的面板上显示内容),因为平板电脑的 屏幕足够大,完全可以同时显示下两页的内容,但手机的屏幕一次就只能显示一页的内容,因此两个页面需要分开显示
那么怎样才能在运行时判断程序应该是使用双页模式还是单页模式呢?这就需要借助 限定符(Qualifiers)来实现了。我们通过一个例子来学习一下它的用法,修改 刚才项目中的 activity_main.xml文件

<LinearLayout xmlns: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.xx.myapplication.LeftFragment"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

这里将多余的代码都删掉,只留下一个左侧碎片,并让它充满整个父布局

接着在 res 目录下新建 layout-large文件夹,在这个文件夹下新建一个布局,也叫做 activity_main.xml

<LinearLayout xmlns: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.xx.myapplication.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><fragmentandroid:id="@+id/right_fragment"android:name="com.example.xx.myapplication.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3" />
</LinearLayout>

layout/activity_main 布局只包含了一个碎片,即单页模式,而 layout-large/ activity_main布局包含了两个碎片,即双页模式
其中 large就是一个限定符,那些屏幕被认 为是 large 的设备就会自动加载 layout-large 文件夹下的布局,而小屏幕的设备则还是会加载 layout文件夹下的布局
在这里插入图片描述

在这里插入图片描述

这样我们就实现了在程序运行时动态加载布局的功能。
Android中一些常见的限定符可以参考下表
在这里插入图片描述

使用最小宽度限定符

在上部分中我们使用 large 限定符成功解决了单页双页的判断问题,不过很快又有一个新的问题出现了,large到底是指多大呢?有的时候我们希望可以更加灵活地为不同设备加 载布局,不管它们是不是被系统认定为“large”,这时就可以使用最小宽度限定符 (Smallest-widthQualifier)了
最小宽度限定符允许我们对屏幕的宽度指定一个最小指(以 dp为单位) ,然后以这个最 小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就 加载另一个布局

在 res 目录下新建 layout-sw600dp 文件夹,然后在这个文件夹下新建 activity_main.xml 布局,这就意味着,当程序运行在屏幕宽度大于 600dp 的设备上时,会加载 layout-sw600dp/ activity_main 布局,当程序运行在屏幕宽度小于 600dp 的设备上时,则仍然加载默认的 layout/activity_main布局

大神的博客

Android Fragment 真正的完全解析(上)
Android Fragment 真正的完全解析(下)
Android Fragment 你应该知道的一切

这篇关于探究碎片Fragment(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982285

相关文章

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

ViewPager+fragment实现切换页面(一)

如今的很多应用中都是下面有一排按钮,点击可以切换页面,滑动也可以切换页面。下面就来简单的实现这个功能。 思路 首先肯定是会用到viewpager这个控件,为了能够向下兼容,最好用v4包下的viewpager,Activity要继承FragmentActivity 其次用一个集合来存储所有的fragment页面在设置viewpager的适配器时,把存储fragment页面的list集合传入ada

安卓中的fragment与viewPager的使用问题的解决

最近使用viewPager,结合fragment使用,发现fragment的周期将不符合他的原有的周期流程,多个fragment将会产生错位问题。       通过研究相关代码,发现fragment的切换实际调用的函数为setUserVisibleHint,通过在其中重写方法,将会达到fragment正确切换的效果。       public void setUserVisible

探究零工市场小程序如何改变传统兼职模式

近年来,零工市场小程序正逐渐改变传统的兼职模式,为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式,以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题,求职者难以快速找到合适的工作,而雇主也难以找到匹配的劳动力。此外,兼职工作的不稳定性和安全性也是求职者关注的焦点。零工市场小程序的兴起,旨在解决这些问题,通过数字化手

apk中签名文件探究(*.SF, *.MF,*.RSA)

文章来源: 作者:嘟嘟小灰 链接:https://www.jianshu.com/p/e07da93acf98 来源:简书 1、取一个apk,然后进行不同签名,生成1.apk、2.apk,并提取META-INF里面的文件进行比对 def calc_sha1(data):sha1obj = hashlib.sha1()if not isinstance(data, (bytear

碎片简介

1、碎片是如何产生的 当生成一个数据库时,它会 分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等。一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space )。 表空间、段、范围、自由空间的逻辑关系如下: 当表空间中生成一个段

TRIZ在充电桩安全中的应用探究

在当今电动汽车日益普及的时代,充电桩的安全问题至关重要。TRIZ(发明问题解决理论)可以为提升充电桩的安全性提供强大助力。具体步骤如深圳天行健企业管理咨询公司下文所述: 一、充电桩安全面临的问题 1.电气安全风险:包括过压、过流、短路等电气故障,可能导致设备损坏、火灾甚至人员伤亡。 2.机械安全风险:如充电桩外壳的坚固程度、充电插头的插拔可靠性等,可能影响用户的使用安全。 3.环境安全

Flink on YARN模式下TaskManager的内存分配探究

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 我们使用如下的参数提交了Flink on YARN作业(per-job模式)。 /opt/flink-1.9.0/bin/flink run \--detached \--jobmanager yarn-cluster \--yarnname "x.y.z" \--yarnjobManagerMemory 2048 \--

BBR 与 AIMD 共存公平性探究

一个古已有之的结论: deep buffer 场景,bbr 相对 reno/cubic 等 aimd 有优势,侵占性强;shallow buffer 场景,aimd 有优势,bbr 带宽被挤占。 本文用实例分析 why 并给出 how。 先看 deep buffer 场景 bbr 单挑 aimd 双流的效果,下图是标准 bbr,被虐成经理: 下图是用 max(bw/delay) 替代 ma