Slide 1

Slide 1 text

ུղ The Navigation Architecture Component 2018/06/07 umeda.apk #4 γʔαʔגࣜձࣾ Itsuki Aoyagi (@yagi2)

Slide 2

Slide 2 text

ࣗݾ঺հ ɾ੨༄ थʢItsuki Aoyagiʣ ɾ΍͗ʹ͍ʢ@yagi2, @yaginierʣ ɾγʔαʔגࣜձࣾ ɾAndroidΞϓϦΤϯδχΞ ɹɹɹɹɹˡ ΞΠίϯɹɹɹɹɹɹຊମ →

Slide 3

Slide 3 text

Navigation Component ɾAndroid Jetpackͷ1ػೳͱͯ͠৽͘͠ఏڙ͞Εͨ ɾը໘ભҠΛ؆୯ʹ࣮૷Ͱ͖ΔΑ͏ʹͳΔ ɾGoogle I/O 2018ͷDeveloper KeynoteͰ ɹʮStoryboardʂʁʯͬͯͳͬͨ͋Ε΋ͦΕͷΤσΟλ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

ͲΜͳ΋Μʁ ɾStoryboardͷը໘ભҠ͚ͩΛൈ͖ग़ͨ͠ײ͡ ɹɾActivity/FragmentؒͷભҠ΍DeepLinkͰͷىಈ ɹɾSafeArgsʹΑΔܕ҆શͳҾ਺ ɹɹˠɹ͜ΕΒ͕XMLͷϦιʔεͰఆٛͰ͖Δ ʢ͖ͬ͞ͷAS্ͷLayout EditorͰ௚ײతʹఆٛͰ͖Δʣ

Slide 6

Slide 6 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 7

Slide 7 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 8

Slide 8 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 9

Slide 9 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 10

Slide 10 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 11

Slide 11 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 12

Slide 12 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 13

Slide 13 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 14

Slide 14 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 15

Slide 15 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 16

Slide 16 text

XMLͷϦιʔεͰఆٛͰ͖Δ ……

Slide 17

Slide 17 text

XMLͷϦιʔεͰఆٛͰ͖Δ

Slide 18

Slide 18 text

͔͍͔ͭͨ ɾContainerʹͳΔActivityͷLayoutͰ ɹΛఆٛ͢Δ ɾ”android:name”ʹ ”androidx.navigation.fragment.NavHostFragment” ɹΛηοτ͢Δ ɾ”app:navGraph”ʹఆٛͨ͠XMLΛηοτ͢Δ

Slide 19

Slide 19 text

͔͍͔ͭͨ

Slide 20

Slide 20 text

͔͍͔ͭͨ

Slide 21

Slide 21 text

͔͍͔ͭͨ

Slide 22

Slide 22 text

͔͍͔ͭͨ ……

Slide 23

Slide 23 text

͔͍͔ͭͨ ……

Slide 24

Slide 24 text

͔͍͔ͭͨ ɾભҠ͍ͤͨ͞λΠϛϯάͰ ɹɹɹNavigation.createNavigateOnClickListener(ભҠͷActionID) ɹΛݺͿ

Slide 25

Slide 25 text

͔͍͔ͭͨ class MainFragment : Fragment() { override fun onCreateView(………): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_main, container , false) } override fun onViewCreated(………) { super.onViewCreated(view, savedInstanceState) view.findViewById(R.id.next_button).setOnClickListener( Navigation.createNavigateOnClickListener(R.id.action_main_to_one) ) } }

Slide 26

Slide 26 text

͔͍͔ͭͨ class MainFragment : Fragment() { override fun onCreateView(………): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_main, container , false) } override fun onViewCreated(………) { super.onViewCreated(view, savedInstanceState) view.findViewById(R.id.next_button).setOnClickListener( Navigation.createNavigateOnClickListener(R.id.action_main_to_one) ) } }

Slide 27

Slide 27 text

͜Ε͚ͩ

Slide 28

Slide 28 text

σϞʢ࿥ըʣ

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

SafeArgs

Slide 31

Slide 31 text

MainFragmentͱ FlowFragmetͷ2ͭͰߏ੒

Slide 32

Slide 32 text

SafeArgs

Slide 33

Slide 33 text

SafeArgs

Slide 34

Slide 34 text

SafeArgs class FlowFragment : Fragment() { override fun onCreateView(…): View? { super.onCreateView(…) val number = arguments?.getInt("number") return when (number) { 1 -> inflater.inflate(R.layout.fragment_one, container, false) 2 -> inflater.inflate(R.layout.fragment_two, container, false) 3 -> inflater.inflate(R.layout.fragment_three, container, false) else -> throw IllegalArgumentException() } } …

Slide 35

Slide 35 text

SafeArgs class FlowFragment : Fragment() { override fun onCreateView(…): View? { super.onCreateView(…) val number = arguments?.getInt("number") return when (number) { 1 -> inflater.inflate(R.layout.fragment_one, container, false) 2 -> inflater.inflate(R.layout.fragment_two, container, false) 3 -> inflater.inflate(R.layout.fragment_three, container, false) else -> throw IllegalArgumentException() } } …

Slide 36

Slide 36 text

SafeArgs class FlowFragment : Fragment() { override fun onCreateView(…): View? { super.onCreateView(…) val number = arguments?.getInt("number") return when (number) { 1 -> inflater.inflate(R.layout.fragment_one, container, false) 2 -> inflater.inflate(R.layout.fragment_two, container, false) 3 -> inflater.inflate(R.layout.fragment_three, container, false) else -> throw IllegalArgumentException() } } … Type Safe?

Slide 37

Slide 37 text

Safe Args

Slide 38

Slide 38 text

SafeArgs

Slide 39

Slide 39 text

SafeArgs public class FlowFragmentArgs { private int number = 3; private FlowFragmentArgs() { } public static FlowFragmentArgs fromBundle(Bundle bundle) { FlowFragmentArgs result = new FlowFragmentArgs(); if (bundle.containsKey("number")) { result.number = bundle.getInt("number"); } return result; } public int getNumber() { return number; } public Bundle toBundle() { Bundle __outBundle = new Bundle(); __outBundle.putInt("number", this.number); return __outBundle; }

Slide 40

Slide 40 text

SafeArgs public class FlowFragmentArgs { private int number = 3; private FlowFragmentArgs() { } public static FlowFragmentArgs fromBundle(Bundle bundle) { FlowFragmentArgs result = new FlowFragmentArgs(); if (bundle.containsKey("number")) { result.number = bundle.getInt("number"); } return result; } public int getNumber() { return number; } public Bundle toBundle() { Bundle __outBundle = new Bundle(); __outBundle.putInt("number", this.number); return __outBundle; } Type Safe! ☺

Slide 41

Slide 41 text

SafeArgs class FlowFragment : Fragment() { override fun onCreateView(…): View? { super.onCreateView(…) val number = arguments?.let { FlowFragmentArgs.fromBundle(it).number } return when (number) { 1 -> inflater.inflate(R.layout.fragment_one, container, false) 2 -> inflater.inflate(R.layout.fragment_two, container, false) 3 -> inflater.inflate(R.layout.fragment_three, container, false) else -> throw IllegalArgumentException() } } …

Slide 42

Slide 42 text

SafeArgs class FlowFragment : Fragment() { override fun onCreateView(…): View? { super.onCreateView(…) val number = arguments?.let { FlowFragmentArgs.fromBundle(it).number } return when (number) { 1 -> inflater.inflate(R.layout.fragment_one, container, false) 2 -> inflater.inflate(R.layout.fragment_two, container, false) 3 -> inflater.inflate(R.layout.fragment_three, container, false) else -> throw IllegalArgumentException() } } …

Slide 43

Slide 43 text

·ͱΊ ɾNavigation͸͔ͬ͠Γ࢖͍͚ͬͯ͹ศརͦ͏ ɾSafeArgs͸࢖Θͳ͍ཧ༝͕ແ͍͘Β͍ʹྑͦ͞͏ ɾʢݸਓతʹ͸ʣFragmentTransaction΄͕͛ແ͍ͷͰָ ࠓճͷιʔε yagi2/Android-Navigation-Sample ɹhttps://github.com/yagi2/Android-Navigation-Sample

Slide 44

Slide 44 text

ৄղͷ঺հ ɾʲAndroidʳGoogle IO 2018Ͱ৽ൃද͞Εͨ navigation ʹ ͍ͭͯͷৄࡉϨϙʔτ - DMM inside ɹ https://inside.dmm.com/entry/2018/05/25/android- navigation ɾNavigation Component // Speaker Deck ɹhttps://speakerdeck.com/satsukies/navigation-component