最新のFragment事情 / Fragment new features

80a3a3857a55f154d23acb705eff72cc?s=47 star_zero
November 21, 2019

最新のFragment事情 / Fragment new features

80a3a3857a55f154d23acb705eff72cc?s=128

star_zero

November 21, 2019
Tweet

Transcript

  1. 最新のFragment事情 Android感謝祭 2019/11/21

  2. About me •Kenji Abe •クックパッド株式会社 •Google Developers Expert for Android

    •Twitter: @STAR_ZERO
  3. Update Fragment

  4. ⚠今回の環境⚠ •Fragment 1.2.0 rc-02 ‣ 2019/11/21時点の最新

  5. Constructor with LayoutId

  6. Constructor with LayoutId •コンストラクタにLayoutIdを渡せるようになった •DataBinding/ViewBindingは非対応 class SampleFragment : Fragment(R.layout.fragment_sample)

  7. Constructor with LayoutId https://developer.android.com/reference/androidx/fragment/app/Fragment.html

  8. FragmentContainerView

  9. FragmentContainerView •これからはFrameLayoutではなくコチラが推奨 •アニメーションのz-orderなどのバグがあった •https://issuetracker.google.com/issues/37036000

  10. FragmentContainerView <androidx.fragment.app.FragmentContainerView android:id="@+id/container" android:name="com.example.SampleFragment" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"

    />
  11. OnBackPressedDispatcher

  12. OnBackPressedDispatcher •Fragmentでバックキーの制御が可能になった •Lifecycleによってコールバックの追加、削除が簡単 •コールバックの有効、無効の切り替えも可能

  13. OnBackPressedDispatcher class SampleFragment : Fragment() { private val callback =

    object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // バックキーが押されたとき... } } override fun onAttach(context: Context) { super.onAttach(context) requireActivity().onBackPressedDispatcher .addCallback(this, callback) } }
  14. OnBackPressedDispatcher class SampleFragment : Fragment() { // ... fun someFunction()

    { callback.isEnabled = false requireActivity().onBackPressedDispatcher.onBackPressed() } }
  15. OnBackPressedDispatcher class MainActivity : AppCompatActivity() { override fun onBackPressed() {

    // FragmentのhandleOnBackPressedの後に呼び出される if (onBackPressedDispatcher.hasEnabledCallbacks()) { // Fragmentのバックキー制御が有効 } else { // Fragmentのバックキー制御が無効 } } }
  16. FragmentFactory

  17. FragmentFactory •Fragmentの生成を行うクラス •Fragmentのコンストラクタに引数が渡せるようになる ‣ コンストラクタインジェクションが可能 •引数なしのコンストラクタ不要 •FragmentScenarioでMock

  18. FragmentFactory class SampleFactory: FragmentFactory() { override fun instantiate( classLoader: ClassLoader,

    className: String ): Fragment { return when (className) { SampleFragment::class.java.name -> SampleFragment("ABC") else -> super.instantiate(classLoader, className) } } }
  19. FragmentFactory class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)

    { supportFragmentManager.fragmentFactory = SampleFactory() super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // fragment-ktx supportFragmentManager.commit { add<SampleFragment>(R.id.container) } } }
  20. FragmentFactory @RunWith(AndroidJUnit4::class) class SampleFragmentTest { @Test fun textSample() { val

    mockFactory = MockFactory() val scenario = launchFragmentInContainer<SampleFragment>( factory = mockFactory ) onView(withId(R.id.text)).check(matches(withText("Hello World!"))) } }
  21. FragmentFactory •Daggerで使うには? ‣ https://satoshun.github.io/2018/11/android_all_inject_ctor/

  22. RESUME_ONLY_CURRENT_FRAGMENT

  23. RESUME_ONLY_CURRENT_FRAGMENT •ViewPagerでonResumeが呼ばれるタイミングが変わる ‣ これまでは表示されてなくてもonResumeが呼ばれてた ‣ 表示されてるFragmentのonResumeのみが呼ばれる •setUserVisibleHintはDeprecated

  24. RESUME_ONLY_CURRENT_FRAGMENT class SampleAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { // 以前の挙動にしたい場合は

    BEHAVIOR_SET_USER_VISIBLE_HINT override fun getItem(position: Int): Fragment { // ... } override fun getCount(): Int { // ... } }
  25. fragment-ktx

  26. fragment-ktx supportFragmentManager.commit { add<SampleFragment>(R.id.container) } val viewModel: SampleViewModel by viewModels()

    val viewModel: SampleViewModel by activityViewModels() val viewModel: SampleViewModel by viewModels { viewModelFactory }
  27. lint

  28. lint

  29. lint

  30. 今後のFragment

  31. 今後のFragment https://www.youtube.com/watch?v=RS1IACnZLy4

  32. 今後のFragment •Multiple Back Stacks •Fragmentの戻り値 •Lifecycleの改善

  33. ありがとうございました