- 本篇参考资料《第一行代码 第三版》 2020.4月出版
- 本篇文章只是本人看书的理解和整理的笔记,更完整的内容还在书上
- 尊重原作者 请购买正版图书
第四章主要讲了基本的UI控件和基本的布局,这部分已掌握,跳过。
第五章Fragment,这个玩意只在一次做底部导航栏的时候,和ViewPage搭配使用过,现在深入了解。
一 Fragment的使用方式
1.如何创建Fragment
2.如何在Activity中添加Fragment
3.如何在Activity中动态添加Fragment
以上三点P209~P214 简单且细小点很多 不copy了
二 Fragment和Activity的交互
2.1 Fragment中调用Activity
非常简单 直接getActivity(),当然Kotlin的语法糖直接简化为了activity
//Fragment生命周期 onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//获取到承载的Activity对象
val mainActivity= activity as MainActivity
//调用其方法
mainActivity.doSomething()
//需要context时也可以
Toast.makeText(activity,"fragment created",Toast.LENGTH_LONG).show()
}
2.2 Activity中调用Fragment
Activity布局文件中加入fragment,并通过name来指定Fragment类名
<fragment
android:id="@+id/leftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:name="qiaodan.yu.firstlineofcodedemo.fragment.LeftFragment"
/>
Activity调用Fragment
//方式一(已废弃)
var fragment= fragmentManager.findFragmentById(R.id.leftFragment) as LeftFragment
//简化的方式
fragment=leftFragment as LeftFragment
fragment.doSomething()
2.3 同一个Activity中Fragment互相调用
非常简单,还是通过Activity来传递:比如我在左边Fragment中调用右边的Fragment方法
val mainActivity=activity as MainActivity
mainActivity.rightFragment.doSomething()
三 Fragment的动态添加和加入返回栈
效果图: 效果图动态修改通过FrameLayout来管理:
MainActivity布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".activity.MainActivity">
<fragment
android:id="@+id/leftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:name="qiaodan.yu.firstlineofcodedemo.fragment.LeftFragment"
/>
<FrameLayout
android:id="@+id/rightFrameLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
/>
</LinearLayout>
代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("界面生命周期", "1---onCreate")
Log.d("Task id", "$taskId")
if (savedInstanceState != null) {
val msg = savedInstanceState.getString("data_key")
}
leftFragmentBtn.setOnClickListener {
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}
private fun replaceFragment(fragment: Fragment) {
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.rightFrameLayout, fragment)
//加入返回栈
transaction.addToBackStack(null)
transaction.commit()
}
四 Fragment生命周期
image.png几乎和Activity一致,但是Fragment多了以下几个生命周期:
onAttach() 当Fragment和Activity建立关联时调用。
onCreateView() 为Fragment创建视图(加载布局)时调用。
onActivityCreated() 确保与Fragment相关联的Activity已经创建完毕时调用。
onDestroyView() 当与Fragment关联的视图被移除时调用。
onDetach() 当Fragment和Activity解除关联时调用。
五 动态加载布局技巧
就像是根据不同屏幕分辨率选择不同分辨率的图片一样,多张同名但你不同清晰度的图片放在不同的文件夹下:ldpi,mdpi, hdpi, xhdpi ,xxhdpi,使用什么由Android系统自行决定。
其实layout作为一种布局资源问价,也可以这样,在res下新建layout-large
文件夹,创建同名的activity_main.xml,这样系统就可以根据不同屏幕大自动选择不同的布局文件了,当然我们也可以自己设置,究竟多大的屏幕为large P222
当然,也和图片一样,原本的layout作为默认,当large中没有布局时,采用默认的。
app的资源管理包括不同清晰度的图片,不同屏幕大小的布局,不同黑夜模式的颜色,不同语言环境的字符串等等,所有资源都应该有一个默认的,按规范创建好资源文件夹,系统根据环境自动选择,当对应环境的文件夹不存在某种资源时,就选择默认的。
网友评论