文章

Fragment简单用法

一到四节演示一个简单例子,在Activity中添加两个Fragment来平分Activity左右空间。

一、新建左Fragment(left_fragment.xml)

<LinearLayout...>
    <Button.../>
</LinearLayout>

二、新建右Fragment(right_fragment.xm)

<LinearLayout...>
    <TextView.../>
</LinearLayout>

三、新建LeftFragment类,继承自Fragment(AndroidX),右Fragment同样

class LeftFragment: Fragment() {
    override fun onCreateView(inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?) : View? {
        return inflater.inflate(R.layout.left_fragment,container,false)
    }
}

四、在activity_main.xml中添加左右Fragment

<LinearLayout android:orientation = "horizontal" ...>
    <fragment
        android:name = "com.example.fragmenttest.LeftFragment"
        android:layout_width = "0dp"
        android:layout_height ="match_parent"
        android:layout_weight = "1" 
        />
    <fragment
         android:name = "com.example.fragmenttest.RightFragment"
        android:layout_width = "0dp"
        android:layout_height ="match_parent"
        android:layout_weight = "1" 
        />
</LinearLayout>

运行软件后可以看到两个Fragment平分左右页面

五、动态添加Fragment

<!-- 将上节中右Fragment代码修改为如下所示 -->
<FragmentLayout
    android:id = "@+id/rightLayout"
    android:layout_width = "0dp"
    android:layout_height ="match_parent"
    android:layout_weight = "1" 
    /> 
// 这里将动态修改Fragment的代码封装成一个方法
// 形参fragment就是要动态切换的Fragment布局对象
private fun replaceFragment(fragment: Fragment){
    val fragmentManager = supportFragmentManager
    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.rightLayout,fragment)
    // 将fragment添加到返回栈,这样用户返回不会直接退出软件(非必须)
    transaction.addToBackStack(null)
    transaction.commit()
}

六、在Fragment与Activity中互相获取对方实例

// 在Activity中获取fragment实例
val fragment = supportFragmentManager.findFragmentById(R.id.leftFragment) as LeftFragment 
// 在Fragment中获取Activity实例
if(activity != null) {
    val mainActivity = activity as MainActivity
}

七、Fragment生命周期

  1. 运行状态:
    关联的Activity运行时,该Fragment也处于运行状态。
  2. 暂停状态:
    Activity暂停/未占满屏幕/Activity到栈顶,Fragment也会处于暂停状态。
  3. 停止状态:
    Activity停止/在调用remove()、replace()前已经入栈,Fragment进入停止状态。
  4. 销毁状态:
    Activity销毁/在调用remove()、replace()前未入栈,Fragment销毁。

Fragment简单用法_1.png

  1. onAttach():当Fragment与Activity建立关联时。
  2. onCreateView():Fragment创建视图/加载布局时调用。
  3. onActivityCreated():Fragment关联的Activity创建完毕时调用。
  4. onDestroyView():与Fragment关联视图被移除时调用。
  5. onDeath():Fragment与Activity解除关联时调用。
License:  CC BY 4.0