androidAndroid

AdroidX 下使用 Activity 和 Fragment

2022-02-10  本文已影响0人  Drew_MyINTYRE
implementation "androidx.activity:activity-ktx:1.4.0"
implementation "androidx.fragment:fragment-ktx:1.4.1"

在构造器中传入布局 ID

class MainActivity : AppCompatActivity(R.layout.activity_main) {
    
    @ExperimentalCoroutinesApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        button.setOnClickListener {
          ...
        }
}

class ContentFragment : Fragment(R.layout.fragment_content) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ...   
    }
}

OnBackPressedDispatcher

有时,您需要阻止用户返回上一级。 在这种情况下,您需要在 Activity 中重写 onBackPressed() 方法。 但是,当您使用 Fragment 时,没有直接的方法来拦截返回。 在 Fragment 类中没有可用的 onBackPressed() 方法,这是为了防止同时存在多个 Fragment 时发生意外行为。

但是,从 AndroidX Activity 1.0.0 开始,您可以使用 OnBackPressedDispatcher ,在 Fragment 中注册 OnBackPressedCallback

import android.content.Context
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment

class MyFragment : Fragment() {

    override fun onAttach(context: Context) {
        super.onAttach(context)
        val callback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                // Do something
            }
        }
        requireActivity().onBackPressedDispatcher.addCallback(this, callback)
    }
}

测试 Fragment

从AndroidX Fragment 1.1.0 开始,可以使用 Fragment 测试组件提供 FragmentScenario 类,该类可以帮助在测试中实例化 Fragment 并进行单独测试

FragmentFactory

Fragment 最常提及的问题之一是不能使用带有参数的构造函数。 例如,如果您使用 Dagger2 进行依赖项注入,则无法使用 Inject 注解 Fragment 构造函数并指定参数。 现在,您可以通过指定 FragmentFactory 类来减少 Fragment 创建过程中的类似问题。 通过在 FragmentManager 中注册 FragmentFactory,可以重写实例化 Fragment 的默认方法

提交 Fragment 的新方式

// Before
supportFragmentManager
  .beginTransaction()
  .add(R.id.container, MyFragment::class.java, null)
  .commit()

// After
supportFragmentManager.commit {
  replace<MyFragment>(R.id.container)
}

FragmentContainerView

如果您将 FrameLayout 用作 Fragment 的容器,则应改用 FragmentContainerView 。 它修复了一些动画 z轴索引顺序问题和窗口插入调度。 从 AndroidX Fragment 1.2.0 开始可以使用 FragmentContainerView

上一篇下一篇

猜你喜欢

热点阅读