美文网首页androidAndroid
AdroidX 下使用 Activity 和 Fragment

AdroidX 下使用 Activity 和 Fragment

作者: Drew_MyINTYRE | 来源:发表于2022-02-10 18:23 被阅读0次
    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

    相关文章

      网友评论

        本文标题:AdroidX 下使用 Activity 和 Fragment

        本文链接:https://www.haomeiwen.com/subject/qfxokrtx.html