第一行代碼-第三版 第五章 Fragment(上)

Fragment 用於兼顧手機平板

5.1 Fragment是什麼

Fragment是一種可以嵌入在Activity當中的UI片段
作用:讓程序更加合理和充分地利用大屏幕的空間。

5.2Fragment的使用方式

  1. 先書寫fragment的佈局文件
  2. 建立對應的類,並讓他繼承自Fragment(注意:此處需要選擇AndroidX庫中的Fragment)
  3. 需要重寫Fragment中的onCreateView()方法
  4. 在需要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>

書上的總結:

  1. 創建待添加Fragment的實例
  2. 獲取FragmentManager,在Activity中可以直接調用getSupportFragmentManager()方法獲取
  3. 開啓一個事務,通過調用beginTransaction()方法開啓。
  4. 向容器內添加或替換Fragment,一般使用replace()方法來實現,需要傳入容器的id和待添加的Fragm實例
  5. 提交事務,調用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第三版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章