- 本篇參考資料《第一行代碼 第三版》 2020.4月出版
- 本篇文章只是本人看書的理解和整理的筆記,更完整的內(nèi)容還在書上
- 尊重原作者 請購買正版圖書
第四章主要講了基本的UI控件和基本的布局季惩,這部分已掌握录粱,跳過。
第五章Fragment画拾,這個(gè)玩意只在一次做底部導(dǎo)航欄的時(shí)候啥繁,和ViewPage搭配使用過,現(xiàn)在深入了解青抛。
一 Fragment的使用方式
1.如何創(chuàng)建Fragment
2.如何在Activity中添加Fragment
3.如何在Activity中動(dòng)態(tài)添加Fragment
以上三點(diǎn)P209~P214 簡單且細(xì)小點(diǎn)很多 不copy了
二 Fragment和Activity的交互
2.1 Fragment中調(diào)用Activity
非常簡單 直接getActivity(),當(dāng)然Kotlin的語法糖直接簡化為了activity
//Fragment生命周期 onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//獲取到承載的Activity對象
val mainActivity= activity as MainActivity
//調(diào)用其方法
mainActivity.doSomething()
//需要context時(shí)也可以
Toast.makeText(activity,"fragment created",Toast.LENGTH_LONG).show()
}
2.2 Activity中調(diào)用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調(diào)用Fragment
//方式一(已廢棄)
var fragment= fragmentManager.findFragmentById(R.id.leftFragment) as LeftFragment
//簡化的方式
fragment=leftFragment as LeftFragment
fragment.doSomething()
2.3 同一個(gè)Activity中Fragment互相調(diào)用
非常簡單,還是通過Activity來傳遞:比如我在左邊Fragment中調(diào)用右邊的Fragment方法
val mainActivity=activity as MainActivity
mainActivity.rightFragment.doSomething()
三 Fragment的動(dòng)態(tài)添加和加入返回棧
效果圖:動(dòng)態(tài)修改通過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生命周期
幾乎和Activity一致蜜另,但是Fragment多了以下幾個(gè)生命周期:
onAttach() 當(dāng)Fragment和Activity建立關(guān)聯(lián)時(shí)調(diào)用适室。
onCreateView() 為Fragment創(chuàng)建視圖(加載布局)時(shí)調(diào)用。
onActivityCreated() 確保與Fragment相關(guān)聯(lián)的Activity已經(jīng)創(chuàng)建完畢時(shí)調(diào)用蚕钦。
onDestroyView() 當(dāng)與Fragment關(guān)聯(lián)的視圖被移除時(shí)調(diào)用亭病。
onDetach() 當(dāng)Fragment和Activity解除關(guān)聯(lián)時(shí)調(diào)用。
五 動(dòng)態(tài)加載布局技巧
就像是根據(jù)不同屏幕分辨率選擇不同分辨率的圖片一樣嘶居,多張同名但你不同清晰度的圖片放在不同的文件夾下:ldpi罪帖,mdpi, hdpi, xhdpi ,xxhdpi促煮,使用什么由Android系統(tǒng)自行決定。
其實(shí)layout作為一種布局資源問價(jià)整袁,也可以這樣菠齿,在res下新建layout-large
文件夾,創(chuàng)建同名的activity_main.xml坐昙,這樣系統(tǒng)就可以根據(jù)不同屏幕大自動(dòng)選擇不同的布局文件了绳匀,當(dāng)然我們也可以自己設(shè)置,究竟多大的屏幕為large P222
當(dāng)然炸客,也和圖片一樣疾棵,原本的layout作為默認(rèn),當(dāng)large中沒有布局時(shí)痹仙,采用默認(rèn)的是尔。
app的資源管理包括不同清晰度的圖片,不同屏幕大小的布局开仰,不同黑夜模式的顏色拟枚,不同語言環(huán)境的字符串等等,所有資源都應(yīng)該有一個(gè)默認(rèn)的众弓,按規(guī)范創(chuàng)建好資源文件夾恩溅,系統(tǒng)根據(jù)環(huán)境自動(dòng)選擇,當(dāng)對應(yīng)環(huán)境的文件夾不存在某種資源時(shí)谓娃,就選擇默認(rèn)的脚乡。