Slide 1

Slide 1 text

/BWJHBUJPO$PNQPOFOU ࣮ફฤ

Slide 2

Slide 2 text

'BDFCPPLIJLPXBJJEF5XJUUFS!ZPQQJF@Y (JUIVCZPTIJZB92JJUBZPQQJF@Y ϒϩάIUUQTZPQQJFYIBUFOBCMPHDPN ZPQQJF

Slide 3

Slide 3 text

ͪΐͬͱখ࿩

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

%SPJE,BJHJ 

Slide 6

Slide 6 text

'SBHNFOU$POUBJOFS7JFX ͱ͸

Slide 7

Slide 7 text

/BWJHBUJPO$PNQPOFOU ࣮ફฤ

Slide 8

Slide 8 text

w "OESPJE+FUQBDLʹؚ·Ε͍ͯΔίϯϙʔωϯτ w "DUJWJUZ΍'SBHNFOUؒͷը໘ભҠΛγϯϓϧʹ࣮૷Ͱ͖Δ
 w ར఺ w 'SBHNFOU5SBOTBDUJPOͷॲཧΛϥΠϒϥϦ͕ߦ͏఺ w %FFQ-JOLͷ࣮૷ͷ؆қԽ w 4BGF"SHTΛ༻͍ͨܕ҆શͷ஋౉͠ w ը໘ભҠͷύλʔϯΛ9.-ʹఆٛ͠ՄࢹԽ
 /BWJHBUJPO(SBQI /BWJHBUJPO$PNQPOFOU

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

4IBSFE7JFX.PEFM
 Λ༻͍ͨ஋ڞ༗

Slide 11

Slide 11 text

՝୊  'SBHNFOU͔Β'SBHNFOU΁஋౉͠Λ͢Δ৔߹
 ௨ৗ4BGF"SHTΛ༻͍ͨܕ҆શͷ஋౉͢͠Δ
 
 ͔͠͠ϗετ͍ͯ͠Δ"DUJWJUZͱ֤'SBHNFOUͰԿ͔Λ ڞ༗͢Δ͜ͱ͕Ͱ͖ͳ͍
  5PPMCBSͷ5JUMFͷมߋ΍ɺ4OBDLCBSͷදࣔΛ
 ֤'SBHNFOUͰߦͳΘͣ"DUJWJUZʹ·ͱΊ͍ͨ

Slide 12

Slide 12 text

Activity Fragment 1 Fragment 4 Fragment 3 Fragment 2 SharedViewModel ղܾࡦ

Slide 13

Slide 13 text

4IBSFE7JFX.PEFMͷྫ class SharedViewModel : ViewModel(){ val fragmentType = MutableLiveData().apply { this.value = FragmentType.FIRST } } enum class FragmentType(val type: String) { FIRST("first"), SECOND("second"), THIRD("third"), FOURTH("fourth") }

Slide 14

Slide 14 text

"DUJWJUZͰ0CTFSWF val sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java) sharedViewModel.fragmentType.observe(this, Observer { value -> value?.let { Snackbar.make( findViewById(android.R.id.content), it.type, Snackbar.LENGTH_SHORT ).show() } }) 4IBSFE7JFX.PEFMͷGSBHNFOU5ZQF͕มߋ͞Εͨ࣌ʹ 4OBDLCBS͕දࣔ͞ΕΔ

Slide 15

Slide 15 text

'SBHNFOUͰQPTU7BMVF sharedViewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java) snackbarButton.clicks().subscribe { sharedViewModel.fragmentType.postValue(FragmentType.FIRST) } "DUJWJUZͰ0CTFSWF͍ͯ͠ΔͷͰɺ
 'SBHNFOUͷ4IBSFE7JFX.PEFMͷΠϯελϯεΛ 7JFX.PEFM1SPWJEFSTPG ͷҾ਺ʹSFRVJSF"DUJWJUZ Λ
 ࢦఆ͠਌ͷ"DUJWJUZʹͻ΋͚ͮͯ࡞੒

Slide 16

Slide 16 text

݁Ռ 4IBSFE7JFX.PEFMΛ࡞Δ͜ͱͰɺ ϗετ͍ͯ͠Δ"DUJWJUZͱ
 ֤'SBHNFOUͰ஋Λڞ༗ "DUJWJUZʹॲཧΛू໿

Slide 17

Slide 17 text

ը໘ભҠޙͱ
 ը໘ભҠ࣌ͷ෼ذॲཧ

Slide 18

Slide 18 text

՝୊ "DUJWJUZ͕࣋ͭ5PPMCBS΍'MPBUJOH"DUJPO#VUUPOͳͲͷ 7JFXͷڍಈΛ'SBHNFOUʹґଘͯ͠มߋͨ͠Γɺ 'SBHNFOUؒͷը໘ભҠ࣌ʹม͍͑ͨ ͔͠͠ɺ'SBHNFOUʹ"DUJWJUZ͕࣋ͭ7JFXͷڍಈͷॲཧΛ ॻ͖ͨ͘ͳ͍ why? val toolbar = view.findViewById(R.id.toolbar) requireActivity().setSupportActionBar(toolbar)

Slide 19

Slide 19 text

'SBHNFOUʹґଘͨ͠ڍಈͷมߋ
 ͳͷͰ'SBHNFOUͰॻ͖ͨ͘ͳΔ 
 ͔͠͠5PPMCBS͸"DUJWJUZ͕อ༗ͯ͠ ͍ΔͷͰɺอकੑͷ؍఺͔Β "DUJWJUZͰॻ͘΂͖ )PNF'SBHNFOUͷ৔߹ͷΈ
 5PPMCBSͷ໭ΔϘλϯԡԼ࣌ ͷڍಈΛมߋ͍ͨ͠


Slide 20

Slide 20 text

ղܾࡦ /BW$POUSPMMFSͷ DVSSFOU%FTUJOBUJPO
 BEE0O%FTUJOBUJPO$IBOHFE-JTUFOFS 
 Λར༻

Slide 21

Slide 21 text

binding.toolbar .navigationClicks() .filter { navController.currentDestination != null } .subscribe { when (navController.currentDestination!!.id) { R.id.homeFragment -> finish() R.id.secondFragment -> navController.navigate( SecondFragmentDirections.homeToFirst() ) } } navController = findNavController(R.id.container_fragment) 'SBHNFOU͝ͱʹ
 5PPMCBSͷॲཧΛ෼ذ

Slide 22

Slide 22 text

navController.addOnDestinationChangedListener { _, destination, _ -> when (destination.id) { R.id.firstFragment -> binding.toolbarButton.visibility = View.GONE R.id.secondFragment -> binding.toolbarButton.visibility = View.VISIBLE } } 'SBHNFOUؒͷը໘ભҠ࣌ ը໘ભҠ࣌ʹ5PPMCBSʹ͋Δ#VUUPOͷWJTJWJMJUZΛมߋ

Slide 23

Slide 23 text

'SBHNFOUʹґଘ΋͘͠͸'SBHNFOU ؒͷը໘ભҠʹΑΔ"DUJWJUZ͕࣋ͭ 7JFX ࠓճͷྫͩͱ5PPMCBS ͷ
 ڍಈมߋΛ'SBHNFOUʹॻ͔ͣʹ "DUJWJUZʹهࡌͰ͖ͨ ݁Ռ

Slide 24

Slide 24 text

#PUUPN/BWJHBUJPO7JFXͱͷ ซ༻࣌ͷঢ়ଶอ࣋

Slide 25

Slide 25 text

՝୊ #PUUPN/BWJHBUJPO7JFXͱ/BWJHBUJPO$PNQPOFOUΛซ༻ ͢Δ৔߹ɺσϑΥϧτͰλϒ੾Γସ͑࣌ʹ'SBHNFOU͕࠶ ੜ੒͞Ε·͢ɻ Αͬͯɺ࠶ੜ੒͞Εͳ͍Α͏ʹ͢ΔͨΊʹ
 'SBHNFOUͷঢ়ଶอ࣋Λ࣮૷͢Δඞཁ͕
 ͋Γ·͢ɻ #PUUPN/BWJHBUJPO7JFX

Slide 26

Slide 26 text

ղܾࡦ 'SBHNFOU/BWJHBUPSΫϥεΛܧঝͨ͠ $VTUPN/BWJHBUPSΫϥεΛ࡞੒͠ɺ
 ঢ়ଶอ࣋͞ΕΔΑ͏ʹOBWJHBUF Λ্ॻ͖

Slide 27

Slide 27 text

@Navigator.Name("custom_fragment") class CustomNavigator( private val context: Context, private val manager: FragmentManager, private val containerId: Int ) : FragmentNavigator(context, manager, containerId) { @Suppress("DEPRECATION") override fun navigate( destination: Destination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Navigator.Extras? ): NavDestination? { // ... } }

Slide 28

Slide 28 text

if (manager.isStateSaved) { return null } var className = destination.className if (className[0] == '.') { className = context.packageName + className } val tag = destination.id.toString() val transaction = manager.beginTransaction() val currentFragment = manager.primaryNavigationFragment if (currentFragment != null) { transaction.hide(currentFragment) } var fragment = manager.findFragmentByTag(tag) if (fragment == null) { fragment = instantiateFragment(context, manager, className, args) transaction.add(containerId, fragment, tag) } fragment.arguments = args transaction.show(fragment) transaction.setPrimaryNavigationFragment(fragment) transaction.commit() return destination Ξχϝʔγϣϯͱ
 #BDL4UBDLपΓͷ ॲཧ͸ল͍͍ͯ·͢

Slide 29

Slide 29 text

class CustomNavHostFragment : NavHostFragment() { override fun createFragmentNavigator( ): Navigator { return CustomNavigator(requireContext(), childFragmentManager, id) } } /BW)PTU'SBHNFOUͷDSFBUF'SBHNFOU/BWJHBUPS ͷ
 ໭Γ஋͕'SBHNFOU/BWJHBUPSͳͷͰܧঝͨ͠ $VTUPN/BW)PTU'SBHNFOUΛ࡞੒্͠ॻ͖

Slide 30

Slide 30 text

OBWJHBUJPOϨΠΞ΢τ $VTUPN/BWJHBUPSΫϥεʹ͚ͭͨ
 !/BWJHBUPS/BNFΞϊςʔγϣϯͷҾ਺ʹࢦఆ͍ͯ͠Δ DVTUPN@GSBHNFOUΛར༻

Slide 31

Slide 31 text

BOESPJEYOBWJHBUJPOGSBHNFOU/BW)PTU'SBHNFOU Ͱ͸ͳࣗ͘࡞ͨ͠$VTUPN/BW)PTU'SBHNFOUΛࢦఆ

Slide 32

Slide 32 text

݁Ռ 'SBHNFOUͷঢ়ଶอ࣋ʹ੒ޭ

Slide 33

Slide 33 text

࠷ޙʹ /BWJHBUJPO$PNQPOFOUΛ࢖͏ͱ "DUJWJUZ΍'SBHNFOUؒͷը໘ભҠΛ
 γϯϓϧʹ࣮૷Ͱ͖Δ ࣮ફͰಋೖ͢ΔͱͳΔͱ
 ӡ༻΍อकੑΛߟྀ͢ΔΑ͏ʹͳΓ ૑ҙ޻෉͕ඞཁ