Fragment 用於兼顧手機平板
5.1 Fragment是什麼
Fragment是一種可以嵌入在Activity當中的UI片段
作用:讓程序更加合理和充分地利用大屏幕的空間。
5.2Fragment的使用方式
- 先書寫fragment的佈局文件
- 建立對應的類,並讓他繼承自Fragment(注意:此處需要選擇AndroidX庫中的Fragment)
- 需要重寫Fragment中的onCreateView()方法
- 在需要Fragment的頁面佈局中引入,(注意:需要設置name屬性,要加上包名)
<fragment
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/leftLrag"
android:name="com.swpu.ylq.fragmenttest.LeftFragment"/>
5.2.2動態添加Fragment
前面幾個步驟同上:但是在引入時存在區別,這裏使用了幀佈局(FrameLayout),用於實現動態添加Fragment
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/rightLayout"
android:layout_weight="1">
</FrameLayout>
書上的總結:
- 創建待添加Fragment的實例
- 獲取FragmentManager,在Activity中可以直接調用getSupportFragmentManager()方法獲取
- 開啓一個事務,通過調用beginTransaction()方法開啓。
- 向容器內添加或替換Fragment,一般使用replace()方法來實現,需要傳入容器的id和待添加的Fragm實例
- 提交事務,調用commit()方法完成。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener{
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}
private fun replaceFragment(fragment: Fragment){
//1.獲取FragmentManager
val fragmentManager = supportFragmentManager
//2.開啓事務,beginTransaction()
val transaction = fragmentManager.beginTransaction()
//3.添加或者替換Fragment,replace()
transaction.replace(R.id.rightLayout,fragment)
//4.提交事務,commit()
transaction.commit()
}
5.2.3在Fragment中實現返回棧
實現:使用FragmentTransaction中提供的**addToBackStack()**方法
private fun replaceFragment(fragment: Fragment){
//1.獲取FragmentManager
val fragmentManager = supportFragmentManager
//2.開啓事務,beginTransaction()
val transaction = fragmentManager.beginTransaction()
//3.添加或者替換Fragment,replace()
transaction.replace(R.id.rightLayout,fragment)
//實現返回棧
transaction.addToBackStack(null)
//4.提交事務,commit()
transaction.commit()
}
5.2.4 Fragment和Activity之間的交互
存在問題:Fragment和Activity是各自存在於一個獨立的類中,它們之間並沒有明顯的方式來直接進行交互
解決問題:FragmentManager 提供了類似於findViewById()的方法,專門用於從佈局文件中獲取Fragment的實例。
val fragment=supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment
問題二:如何在Fragment中調用Activity中的方法?
解決問題二:在每個Fragment中可以通過調用getActivity()方法來的得到和當前Fragment相關聯的Activity實例(注意:由於getActivity()方法有可能返回null,需要進行判空處理)
2020/4/16 詳細內容可以閱讀第一行代碼,Android第三版