Fragment是什么 手机屏幕在3英寸到6英寸之间,平板在7英寸到10英寸之间,屏幕大小差距过大会导致元素过分拉长,元素空隙过大的问题。因此引入Fragment概念。Fragment是嵌入在Activity当中的UI片段,能让程序更合理和充分的利用大屏空间,可以理解为迷你型Activity。 Fragment简单用法 新建左侧Fragment布局left_fragment.xml和右侧right_fragment.xml

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

再建立LeftFragment类和RightFragment类,基于Fragment加载刚才的布局xml。

package com.example.myapplicationimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment//在这里一定要使用androidX的Fragment,因为他可以让Fragment的特性在所有Android系统中保持一致,系统内置的在9.0版本被废除。
class LeftFragment : Fragment() {//仅仅重写了onCreateView方法override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {//通过LayoutInflater将方才定义的left_fragment加载进来return inflater.inflate(R.layout.left_fragment, container, false)}
}
package com.example.myapplicationimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
//同样方式使用Fragment加载右布局
class RightFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.right_fragment, container, false)}
}

修改Activity_main里面的代码,通过Fragment标签加载Fragment

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"><fragment android:id="@+id/left_frag" android:name="com.example.myapplication.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/><fragment android:id="@+id/right_frag" android:name="com.example.myapplication.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/>LinearLayout> 

动态加载Fragment Fragment强大之处在于在程序运行时动态将其添加到Activity当中,下面来研究下。新建another_right_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" android:orientation="vertical"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="This is another right fragment" android:textSize="24sp" />LinearLayout> 

新建AnotherRightFragment类作为另一侧需要动态添加的Fragment。

package com.example.fragmenttestimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragmentclass AnotherRightFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.another_right_fragment,container,false)}
}

修改Activity_main的布局,确保能够动态映射到此布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"><fragment android:id="@+id/left_frag" android:name="com.example.myapplication.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /><FrameLayout android:id="@+id/frame_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />LinearLayout> 

最后在MainActivity中向刚才的Framelayout中添加内容,给予FragmentManager的transaction事物

package com.example.myapplicationimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.left_fragment.*
//完成动态添加Fragment的功能,五步走战略
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//第一步,创建添加Fragment的实例left_button.setOnClickListener{replaceFragment(AnotherRightFragment())}replaceFragment(RightFragment())}fun replaceFragment(fragment:Fragment){//第二步,获取FragmentManagerval fragmentManager = supportFragmentManager//第三步,开启一个事务val transaction = fragmentManager.beginTransaction()//第四步,向容器内添加或者替换Fragment,一般使用replace来代替,传递id和添加的Fragment实例transaction.replace(R.id.frame_layout,fragment)//第五步,提交事务transaction.commit()}
}

在Fragment中实现返回栈 点击Back键退出了程序,那么要想点击back键回到上一个Fragment。实现的方法是FragmentTransaction中提供了addToBackStack方法,可以用于将一个事物添加到返回栈中。

package com.example.fragmenttestimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import androidx.fragment.app.Fragmentclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val button = findViewById<Button>(R.id.button)replaceFragment(RightFragment())button.setOnClickListener{replaceFragment(AnotherRightFragment())}}private fun replaceFragment(fragment: Fragment) {val fragmentManager = supportFragmentManagerval transaction = fragmentManager.beginTransaction()transaction.replace(R.id.rightLayout,fragment)transaction.addToBackStack(null)transaction.commit()}
}

Fragment和Activity之间的交互 虽说是嵌入,但其实分属不同类。如果Activity想调用Fragment里面的方法或者是Fragment想调用Activity里面的方法,该咋办?为了方便交互,FragmentManager提供了一个类似于findViewByID的方法,专门从布局文件中获取Fragment的实例,代码如下所示

 val fragment = supportFragmentManager.findFragmentById(R.id.left_frag) as LeftFragment

这样可以在Activity中简单获取Fragment的实例,轻松调用Fragment里面的方法。Kotlin中对findFragmentByid方法进行了扩展,允许直接使用布局文件中的id名称直接获取相应的Fragment实例,简化代码如下

val fragment  = R.id.rightLayout as RightFragment

Fragment如何调用Activity里面的方法呢?每个Fragment当中都可以通过getActivity获得和当前Fragment相关联的实例,代码如下:

        //MainActivity可能为null,因此需要判空处理if(activity!=null){//获得Activity实例,当需要context对象时,也可以使用getActivity方法val mainActivity = activity as MainActivity}

两个Fragment之间如何通信?Fragment找Actiiity,Activity获取另一个Fragment实例,这样完成了通信功能。 Fragment生命周期

有四种状态:运行,暂停,停止,销毁四种状态。运行状态:Fragment相关联的Activity正在运行。暂停:当一个Activiyt进行暂停状态(另一个占满Activity进入栈顶),则与此相关联的Fragment也暂停;停止:Activity停止或者FragmentTransaction的repalace移除被调用,但在此之间调用了addTOBackStack方法;终止:Activity被销毁或者FragmentTransaction的remove和replace移除被调用。未调用addToBackStack方法。

几个回调方法:onAttach:Fragment和Activity建立关联(用来获得activiy的传递的值);onCreateView方法:为Fragment加载布局时调用。;onActivityCreated方法:确保Fragment相关联的Activity已经创建完毕时调用;(表示activity执行oncreate方法完成了的时候会调用此方法);onDestroyView方法:Fragment中的布局被移除时调用。onDetach方法:顾名思义,是Fragment和Activity解除关联的时候调用。

Fragment CATION2安卓相关推荐

  1. 安卓APP_ Fragment(1)—— Fragment概念、基础用法、动态变换、管理栈

    摘自:安卓APP_ Fragment(1)-- Fragment概念.基础用法.动态变换.管理栈 作者:丶PURSUING 发布时间: 2021-04-15 23:32:31 网址:https://b ...

  2. 2020年安卓学习笔记目录

    文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...

  3. 安卓开发个人小作品(2)- QQ简仿

    个人小作品系列,这次继续介绍自己曾经写的一些"小玩意",这次就介绍下自己初学安卓时,写的一个简仿QQ吧. 里面都是一些基础知识,但是作为初学者来说,还是可以学到很多东西的. 由于这 ...

  4. 学习笔记 | Android Studio安卓开发入门经验总结 干货

    前言 最近完成了移动编程课程的学习,加上其它安卓开发项目的经历,感觉收获颇为丰富.故在此总结整理安卓开发中比较常见的一些问题,技巧和指南. 0.目录 文章目录 前言 0.目录 1.开发环境 2. 项目 ...

  5. Android应用开发的学习

    目录 关于Android Studio 1.开发环境 1.1首先,我们需要安装Android Studio,这是一个用于开发Android应用的集成开发环境(IDE).您可以从官方网站下载并安装它. ...

  6. 安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页

    摘自:安卓APP_ Fragment(5)-- Fragment + ViewPager2 模拟微信首页 (2)两者联动实现翻页 作者:丶PURSUING 发布时间: 2021-04-22 00:11 ...

  7. 安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页

    摘自:安卓APP_ Fragment(4)-- Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页 作者:丶PURSUING 发布时间: 2021-04-20 17:46 ...

  8. 安卓APP_ Fragment(3)—— Fragment的生命周期

    摘自:安卓APP_ Fragment(3)-- Fragment的生命周期 作者:丶PURSUING 发布时间: 2021-04-16 22:32:12 网址:https://blog.csdn.ne ...

  9. 安卓APP_ Fragment(2)—— Activity与Fragment的通信

    摘自:安卓APP_ Fragment(2)-- Activity与Fragment的通信 作者:丶PURSUING 发布时间: 2021-04-16 17:23:44 网址:https://blog. ...

最新文章

  1. ACL中的wildcard mask
  2. python入门教程共四本书籍-Python入门经典书籍有哪些?有这三本就够了
  3. LeetCode Insert Delete GetRandom O(1) - Duplicates allowed
  4. css选择器(css Selectors)的语法分析
  5. 计算机网络ipv4到ipv6怎么实现,论计算机网络协议IPV4到IPV6的过渡策略|房屋搬迁过渡协议...
  6. yarn oom问题一例
  7. 互联网日报 | 6月18日 星期五 | 百度与极狐发布量产共享无人车;奈雪的茶预计6月30日登陆港交所;阿里云盘上线PC版...
  8. python all和any用法_python any()和all()用法
  9. 《转》ReentrantLock实现原理深入探究
  10. 剑指offer--二叉树中和为某一值得路径
  11. html5仿微博弹出,JS 仿腾讯发表微博的效果代码
  12. VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)
  13. 四叶草关闭啰嗦模式_教你如何解决 Win7 64位卡LOGO(四叶草)
  14. 从程序员到项目经理(2)
  15. 【控制理论】矩阵求逆引理推导及理解
  16. nyoj234 吃土豆
  17. 《python语言程序设计》笔记
  18. 在购买太阳眼镜时怎样辨别好坏
  19. 基于区块链的数据透明化:问题与挑战 Blockchain-Based Data Transparency: Issues and Challenges
  20. Arduino实验三:继电器实验

热门文章

  1. pyecharts进行数据可视化--多图形组合拼装
  2. stm32成长记之滴答时钟
  3. 采购谈判技巧:报价谈判,怎么谈你会赢?
  4. Ansible多剧本练习
  5. vue+elementUI 使用腾讯地图
  6. 解决Ubuntu下耳机没有声音的问题
  7. 简单聊聊Promise
  8. java开发edusoho,开发 · EduSoho开发指南
  9. String中intern方法的作用
  10. ! [rejected] master - master (fetch first) error: failed to push some refs to 'https://gith