Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

About me •Kenji Abe •クックパッド株式会社 •Google Developers Expert for Android •Twitter: @STAR_ZERO

Slide 3

Slide 3 text

Update Fragment

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Constructor with LayoutId

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

FragmentContainerView

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

FragmentContainerView

Slide 11

Slide 11 text

OnBackPressedDispatcher

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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) } }

Slide 14

Slide 14 text

OnBackPressedDispatcher class SampleFragment : Fragment() { // ... fun someFunction() { callback.isEnabled = false requireActivity().onBackPressedDispatcher.onBackPressed() } }

Slide 15

Slide 15 text

OnBackPressedDispatcher class MainActivity : AppCompatActivity() { override fun onBackPressed() { // FragmentのhandleOnBackPressedの後に呼び出される if (onBackPressedDispatcher.hasEnabledCallbacks()) { // Fragmentのバックキー制御が有効 } else { // Fragmentのバックキー制御が無効 } } }

Slide 16

Slide 16 text

FragmentFactory

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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) } } }

Slide 19

Slide 19 text

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(R.id.container) } } }

Slide 20

Slide 20 text

FragmentFactory @RunWith(AndroidJUnit4::class) class SampleFragmentTest { @Test fun textSample() { val mockFactory = MockFactory() val scenario = launchFragmentInContainer( factory = mockFactory ) onView(withId(R.id.text)).check(matches(withText("Hello World!"))) } }

Slide 21

Slide 21 text

FragmentFactory •Daggerで使うには? ‣ https://satoshun.github.io/2018/11/android_all_inject_ctor/

Slide 22

Slide 22 text

RESUME_ONLY_CURRENT_FRAGMENT

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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 { // ... } }

Slide 25

Slide 25 text

fragment-ktx

Slide 26

Slide 26 text

fragment-ktx supportFragmentManager.commit { add(R.id.container) } val viewModel: SampleViewModel by viewModels() val viewModel: SampleViewModel by activityViewModels() val viewModel: SampleViewModel by viewModels { viewModelFactory }

Slide 27

Slide 27 text

lint

Slide 28

Slide 28 text

lint

Slide 29

Slide 29 text

lint

Slide 30

Slide 30 text

今後のFragment

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

ありがとうございました