Slide 1

Slide 1 text

΢Οϯυ΢αΠζͷมߋʹڧ͍ ݎ࿚ͳը໘ͷߏங

Slide 2

Slide 2 text

Fablic, inc. Android Application Developer தଜܙଠ @nakamuuu @chicken_111 2 ࣗݾ঺հ

Slide 3

Slide 3 text

ྦྷܭ ສ μ΢ϯϩʔυ ಥഁʂ 3 ϑϦϚΞϓϦʮϑϦϧʯʹ͍ͭͯ

Slide 4

Slide 4 text

ϑϦϚΞϓϦʮϑϦϧʯʹ͍ͭͯ 4 ϑϦϚΞϓϦʮϑϦϧʯ͸ ৽͍͠ʮϥΫϚʯͱͯ͠ੜ·ΕมΘΓ·͢ʂ ʢ50%0-1ͷεΫγϣʣ

Slide 5

Slide 5 text

ྦྷܭ 5 ϑϦϚΞϓϦʮϑϦϧʯʹ͍ͭͯ

Slide 6

Slide 6 text

ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ ɹݎ࿚ͳը໘ʱͱ͸ʁ 6

Slide 7

Slide 7 text

7 ΢Οϯυ΢αΠζͷมߋ ը໘ճస Ϛϧν΢Οϯυ΢ ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͱ͸ʁ

Slide 8

Slide 8 text

8 ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͱ͸ʁ ΢Οϯυ΢αΠζͷมߋΛߟྀ͠ͳ͍ͱʜʁ

Slide 9

Slide 9 text

9 ϨΠΞ΢τͷ่Ε ʢྫʣ௨ৗͱҟͳΔγεςϜ6*ͷ഑ஔΛߟྀͰ͖͍ͯͳ͍ ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͱ͸ʁ εςʔλεόʔ෼ͷ༨ന

Slide 10

Slide 10 text

10 ը໘ͷঢ়ଶ͕ࣦΘΕΔ ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͱ͸ʁ

Slide 11

Slide 11 text

11 ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱ ɾ͍͔ͳΔ΢Οϯυ΢αΠζɾγεςϜ6*ͷ഑ஔͰ΋ ɹϨΠΞ΢τͷ่Ε͕ൃੜ͠ͳ͍ ɾߏ੒ͷมߋΛލ͍Ͱ΋"DUJWJUZ'SBHNFOU͕ ɹը໘ͷঢ়ଶΛద੾ʹอ࣋ɾදࣔ͢Δ ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͱ͸ʁ

Slide 12

Slide 12 text

12 w΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங w8JOEPX*OTFUTΛཧղͯ͠ɺγεςϜ6*ͷ഑ஔʹɹ Өڹ͞Εͳ͍ϨΠΞ΢τΛ૊Ή wߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ wTBWFE*OTUBODF4UBUFɺTFU3FUBJO*OTUBODFɺɹɹ ͦΕͧΕͷঢ়ଶอ࣋ͷख๏ͷར఺ͱ࢖͍෼͚ ࠓ೔͓࿩͢͠Δ͜ͱ

Slide 13

Slide 13 text

΢Οϯυ΢αΠζͷมߋʹڧ͍ ϨΠΞ΢τͷߏங 13

Slide 14

Slide 14 text

14 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங Ϛϧν΢Οϯυ΢ػೳͷଘࡏ ϨΠΞ΢τͷߏஙͰߟྀ͢΂͖͜ͱ͕૿͑ͨ w෯ɾߴ͞ڞʹදࣔྖҬ͕ڱ͍ঢ়ଶͰͷϨΠΞ΢τ wMBZPVUEJNFOϦιʔεͷΑΓద੾ͳ࢖͍෼͚ w௨ৗͱҟͳΔγεςϜ6*ʢεςʔλεόʔ౳ʣͷ഑ஔ

Slide 15

Slide 15 text

15 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ௨ৗͱҟͳΔγεςϜ6*ʢεςʔλεόʔ౳ʣͷ഑ஔ εςʔλεόʔͷߴ͞Λ ద੾ʹѻΘͳ͍ͱ༨෼ͳεϖʔε͕

Slide 16

Slide 16 text

16 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ෆࢥٞͳεςʔλεόʔͷ୺຤΋ʜʁ

Slide 17

Slide 17 text

17 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங 04όʔδϣϯ͝ͱʹఆٛʜʁ 0dp WBMVFTEJNFOTYNM 25dp WBMVFTWEJNFOTYNM 24dp WBMVFTWEJNFOTYNM val resId = res.getIdentifier(“status_bar_height”, “dimen”, “android”) val statusBarHeight = res.getDimensionPixelSize(resId) γεςϜϦιʔεΛऔಘʜʁ

Slide 18

Slide 18 text

18 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங BOESPJEGJUT4ZTUFN8JOEPXT ʮεςʔλεόʔͷߴ͞Λऔಘ͢Δʯͱ͍͏ Ξϓϩʔν͸Ұ୴ٙ͏΂͖ #PPMFBOJOUFSOBMBUUSJCVUFUPBEKVTUWJFXMBZPVUCBTFEPO TZTUFNXJOEPXTTVDIBTUIFTUBUVTCBS*GUSVF BEKVTUTUIF QBEEJOHPGUIJTWJFXUPMFBWFTQBDFGPSUIFTZTUFNXJOEPXT

Slide 19

Slide 19 text

19 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ฐࣾ"OESPJEΤϯδχΞʹฉ͖·ͨ͠ งғؾͰ࢖͍ͬͯΔ7JFXͷϓϩύςΟ͸ʁ GJUT4ZTUFN8JOEPXT ະճ౴

Slide 20

Slide 20 text

20 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ฐࣾ"OESPJEΤϯδχΞʹฉ͖·ͨ͠ งғؾͰ࢖͍ͬͯΔ7JFXͷϓϩύςΟ͸ʁ GJUT4ZTUFN8JOEPXT ະճ౴ ʢճ౴਺ʣ

Slide 21

Slide 21 text

21 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ʢσϑΥϧτͷڍಈʣ wGJUT4ZTUFN8JOEPXTΛࢦఆ͢ΔͱγεςϜ6*෼ͷ QBEEJOHΛ͚ͭͯදࣔˍࢠ7JFXΛ഑ஔ͢Δ wGJUT4ZTUFN8JOEPXTΛࢦఆͨ͠7JFX͕ෳ਺ݸɹ ଘࡏ͢Δ৔߹ɺਂ͞༏ઌతʹ୧ͬͨ࠷ॳͷ7JFX͚ͩ Πϯηοτ͕EJTQBUDI͞ΕΔ w8JOEPX*OTFUTʹDPOTVNFEͰ͋Δ͔ͷϑϥά͕ ଘࡏ͢Δ ˞7JFXPO"QQMZ8JOEPX*OTFUT7JFX(SPVQEJTQBUDI"QQMZ8JOEPX*OTFUTࢀর

Slide 22

Slide 22 text

22 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ˞TFU4ZTUFN6J7JTJCJMJUZ 4:45&.@6*@'-"(@-":065@'6--4$3&&/ c4:45&.@6*@'-"(@-":065@45"#-& Λࢦఆ

Slide 23

Slide 23 text

23 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங

Slide 24

Slide 24 text

24 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங GJUT4ZTUFN8JOEPXTΛUSVFʹͰ͖Δ7JFX͸͚ͭͩʁ ʢ"OESPJE4UVEJPͷςϯϓϨʔτʮ/BWJHBUJPO%SBXFS"DUJWJUZʯʣ

Slide 25

Slide 25 text

25 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ࣗ਎·ͨ͸ࢠ7JFXͷGJUT4ZTUFN8JOEPXTͷ ղऍΛΧελϚΠζ͢Δ͜ͱ͕Մೳ 8JOEPX*OTFUTΛQBEEJOHʹ෇͚ସ͑Δͷ͸ 7JFXPO"QQMZ8JOEPX*OTFUTͰͷσϑΥϧτͷڍಈ

Slide 26

Slide 26 text

26 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங 7JFXPO"QQMZ8JOEPX*OTFUT 8JOEPX*OTFUTΛQBEEJOHʹ෇͚ସ͑Δͷ͕σϑΥϧτ ΦʔόʔϥΠυ͠ͳͯ͘΋ 0O"QQMZ8JOEPX*OTFUT-JTUFOFSͰॲཧΛԣऔΓͰ͖Δ // View#onApplyWindowInsetsͷ୅ΘΓʹݺ͹ΕΔ ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> // View#onApplyWindowInsets ͷσϑΥϧτͷॲཧΛߦ͏͜ͱ΋Մೳ val result = ViewCompat.onApplyWindowInsets(v, insets) // ద੾ͳWindowInsetsΛฦ͢ return result }

Slide 27

Slide 27 text

ʢ%SBXFS-BZPVUͷڍಈʣ 27 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங w0O"QQMZ8JOEPX*OTFUT-JTUFOFSͰ 8JOEPX*OTFUTͷมߋΛݕ஌SFRVFTU-BZPVU w7JFXPO"QQMZ8JOEPX*OTFUT͕ݺ͹Εͳ͘ͳΓɺ QBEEJOH͕෇༩͞Εͳ͘ͳΔ wPO.FBTVSFͰGJUT4ZTUFN8JOEPXT͕USVFͳɹɹ ࢠ7JFXʹରͯ͠ΠϯηοτΛ௚઀EJTQBUDI wಉ࣌ʹGJUT4ZTUFN8JOEPXT͕GBMTFͳࢠ7JFXͷ NBSHJOʹΠϯηοτ෼ͷ஋Λઃఆ

Slide 28

Slide 28 text

28 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ίϯςϯπྖҬ ʢGJUT4ZTUFN8JOEPXTGBMTFʣ wPO.FBTVSFͰNBSHJOΛ෇༩͞ ΕΔͷͰεςʔλεόʔʹඃΒͣ දࣔ͞ΕΔ ˞εςʔλεόʔͷྖҬ͸0O"QQMZ8JOEPX*OTFUT-JTUFOFSͰऔಘ͞Εͨ ΠϯηοτΛجʹ%SBXFS-BZPVU͕ࣗલͰృΓͭͿ͢ ʢBOESPJETUBUVT#BS$PMPSʹ͸!BOESPJEDPMPSUSBOTQBSFOUΛࢦఆʣ

Slide 29

Slide 29 text

29 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங /BWJHBUJPO7JFX ʢGJUT4ZTUFN8JOEPXTUSVFʣ w8JOEPX*OTFUT͕QBEEJOHʹ ෇͚ସ͑ΒΕͳ͍ͷͰεςʔλ εόʔͷྖҬ·Ͱදࣔ͞ΕΔ w8JOEPX*OTFUT͕EJTQBUDI ͞ΕΔͷͰɺΠϯηοτΛϋϯ υϧͰ͖Δ

Slide 30

Slide 30 text

30 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ࠔͬͨ࣌ͷEJTQBUDIܳ ࣗ਎ʹ΋ࢠ7JFXʹ΋8JOEPX*OTFUTΛ෇༩͍ͤͨ͞ʂ wPO.FBTVSF΍PO"QQMZ8JOEPX*OTFUTͰࢠ7JFX ͷEJTQBUDI"QQMZ8JOEPX*OTFUTΛ௚઀ݺͿ wྫ͑͹/BWJHBUJPO7JFXͰ͸ࣗ਎ʹ෇༩͞Εͨɹɹ ΠϯηοτΛϔομʔ༻ͷ7JFX΁EJTQBUDI͍ͯ͠Δ ˞/BWJHBUJPO.FOV1SFTFOUFSEJTQBUDI"QQMZ8JOEPX*OTFUTࢀর

Slide 31

Slide 31 text

31 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங ͋Δ͍͸ʜ PO"QQMZ8JOEPX*OTFUTͰDPOTVNF͠ͳ͍ ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> // View#onApplyWindowInsets ͷσϑΥϧτͷॲཧΛߦΘͤΔ ViewCompat.onApplyWindowInsets(v, insets) // ௨ৗ͸insets.consumeSystemWindowInsets()Λฦ͕͢ɺ // ࣗ਎Ҏ߱ͷViewʹ΋ΠϯηοτΛ෇༩͍ͨ͠ͷͰinsetsΛͦͷ··ฦ͢ return insets } GJUT4ZTUFN8JOEPXTUSVFͳΒDPOTVNF͞ΕΔ લఏ่͕ΕΔͷͰཚ༻͢Δͱࠞಱͱͦ͠͏ʜ

Slide 32

Slide 32 text

32 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங εςʔλεόʔͷߴ͞Λऔಘ͢Δ ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> statuBarSize = insets.systemWindowInsetTop return ViewCompat.onApplyWindowInsets(v, insets) } ͦΕͰ΋GJUT4ZTUFN8JOEPXTͰ͸Ͳ͏ʹ΋Ͱ͖ͳ͍ PS εςʔλεόʔͷྖҬʹESBX͍ͨ͠ ˞/BWJHBUJPO7JFXͷܧঝݩͰ͋Δ4DSJN*OTFUT'SBNF-BZPVU͕޷ྫ

Slide 33

Slide 33 text

33 ΢Οϯυ΢αΠζͷมߋʹڧ͍ϨΠΞ΢τͷߏங wεςʔλεόʔͳͲͷαΠζΛΉ΍Έʹऔಘ͠Α͏ͱ ͤͣʹɺGJUT4ZTUFN8JOEPXTΛ׆༻͢΂͖ wෳࡶͳը໘Ͱ͸0O"QQMZ8JOEPX*OTFU-JTUFOFSͰ σϑΥϧτͷॲཧΛԣऔΓͨ͠ΓɺࣗલͰࢠ7JFXʹ ରͯ͠8JOEPX*OTFUTΛEJTQBUDI͢Δํ๏͕࢖͑Δ γεςϜ6*ͷ഑ஔʹӨڹ͞Εͳ͍ϨΠΞ΢τΛ૊Ήʹ͸ʁ 8JOEPX*OTFUTͷѻ͍Λ޻෉ͯ͠ γεςϜ6*ͷ഑ஔʹڧ͍ϨΠΞ΢τߏஙΛ

Slide 34

Slide 34 text

ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ ͍ͭͯ 34

Slide 35

Slide 35 text

35 ը໘ͷঢ়ଶ͕ࣦΘΕΔ ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ

Slide 36

Slide 36 text

36 w΢Οϯυ΢αΠζͷมߋͳͲͷߏ੒ͷมߋ࣌ʹ͸ɹɹ ࣮ߦதͷ"DUJWJUZ'SBHNFOU͸࠶ੜ੒͞ΕΔ w৽͍͠ߏ੒༻ͷϦιʔεΛ࢖༻ͨ͠දࣔʹ੾Γସ͑ ΔͷΛࢧԉ͢ΔͨΊͷσϑΥϧτͷڍಈ wBOESPJEDPOGJH$IBOHFTΛࢦఆ͢Δ͜ͱͰࣗલ Ͱ΋؅ཧͰ͖Δ ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ ߏ੒ͷมߋΛލ͍Ͱը໘ঢ়ଶʹؔ͢ΔσʔλΛ ద੾ʹอ࣋͢Δ͜ͱ͕ཁٻ͞ΕΔ

Slide 37

Slide 37 text

37 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ "OESPJE%FWFMPQFST ʮ)BOEMJOH$POGJHVSBUJPO$IBOHFTʯ

Slide 38

Slide 38 text

38 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ ᶃ PO4BWF*OTUBODF4UBUF Ͱ#VOEMFʹ֨ೲ͠ɺ PO$SFBUF PO3FTUPSF*OTUBODF4UBUF Ͱ෮ݩ ᶄ TFU3FUBJO*OTUBODF USVF Λݺͼग़ͨ͠'SBHNFOU ʹσʔλΛ֨ೲ "OESPJE%FWFMPQFST ʮ)BOEMJOH$POGJHVSBUJPO$IBOHFTʯ

Slide 39

Slide 39 text

39 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ ᶃPO4BWF*OTUBODF4UBUF Ͱอ࣋ class ExampleActivity: AppCompatActivity() { private var foo: Foo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) foo = savedInstanceState?.getParcelable("foo") } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putParcelable("foo", foo) } }

Slide 40

Slide 40 text

ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ 40 wγϦΞϥΠζɾσγϦΞϥΠζΛ൐͍ɺϝϞϦফඅɾ ଎౓ͷ໘Ͱίετ͕େ͖͍ͷͰɺଟྔͷσʔλΛอ࣋ ͢Δ༻్ʹ͸޲͔ͳ͍ wߏ੒ͷมߋதʹ΋ঢ়ଶ͕มΘΓ͏Δεςʔτϑϧͳɹ ΦϒδΣΫτͷอ࣋ʹ͸࢖༻Ͱ͖ͳ͍ wωοτϫʔΫ઀ଓͷܧଓͳͲʹ͸༻͍ʹ͍͘ ᶃPO4BWF*OTUBODF4UBUF Ͱอ࣋

Slide 41

Slide 41 text

ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ 41 w4DSPMM7JFX:ํ޲ͷεΫϩʔϧҐஔΛอ࣋ w5FYU7JFXBOESPJEGSFF[FT5FYU͕USVFͳ৔߹ʹɹɹ ςΩετΛอ࣋ʢ&EJU5FYU͸σϑΥϧτͰUSVFʣ w$PNQPVOE#VUUPODIFDLFEͰ͋Δ͔Λอ࣋ ᶃPO4BWF*OTUBODF4UBUF Ͱอ࣋ Ұ෦ͷ7JFX͸ࣗલͰঢ়ଶΛอ࣋͢Δ ʢ˞֤7JFXͷPO4BWF*OTUBODF4UBUF ͷ࣮૷ࢀরʣ

Slide 42

Slide 42 text

42 ᶃPO4BWF*OTUBODF4UBUF Ͱอ࣋ "OESPJEҎ߱ͰଟྔͷσʔλΛอ࣋͢Δͱ 5SBOTBDUJPO5PP-BSHF&YDFQUJPO͕UISPX͞ΕΔ ʢ"OESPJE#FIBWJPS$IBOHFTʣ ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ

Slide 43

Slide 43 text

HVBSEJBOUPPMBSHFUPPM IUUQTHJUIVCDPNHVBSEJBOUPPMBSHFUPPM 43 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ

Slide 44

Slide 44 text

44 ᶄ'SBHNFOUTFU3FUBJO*OTUBODF USVF Λ༻͍ͯอ࣋ class ExampleActivity: AppCompatActivity() { private var retainedFragment: RetainedFragment? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) retainedFragment = getSupportFragmentManager() .findFragmentByTag(“tag") as? RetainedFragment if (retainedFragment == null) { // লུ: RetainedFragmentͷΠϯελϯεΛੜ੒ˍcommit } } } class RetainedFragment: Fragment() { var foo: Foo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setRetainInstance(true) } } ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ

Slide 45

Slide 45 text

ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ 45 ᶄ'SBHNFOUTFU3FUBJO*OTUBODF USVF Λ༻͍ͯอ࣋ wγϦΞϥΠζɾσγϦΞϥΠζΛ൐Θͳ͍ͨΊɺɹɹ εςʔτϑϧͳΦϒδΣΫτͷอ࣋ʹ࢖༻Ͱ͖Δ w"SDIJUFDUVSF$PNQPOFOUTͷ7JFX.PEFM΋ TFU3FUBJO*OTUBODF USVF Λݺͼग़ͨ͠'SBHNFOU Ͱอ࣋͞Ε͍ͯΔ ˞BOESPJEBSDIMJGFDZDMF)PMEFS'SBHNFOUࢀর

Slide 46

Slide 46 text

46 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ ඇਪ঑ʜʁ PO3FUBJO$VTUPN/PO$POGJHVSBUJPO*OTUBODF Ͱอ࣋ class ExampleActivity: AppCompatActivity() { private var foo: Foo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) foo = getLastCustomNonConfigurationInstance() as? Foo } override fun onRetainCustomNonConfigurationInstance(): Any? { return foo } }

Slide 47

Slide 47 text

47 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ w"OESPJEY࣌୅·Ͱਪ঑͞Ε͍ͯͨํ๏ w"DUJWJUZPO3FUBJO/PO$POGJHVSBUJPO*OTUBODF ͷEFQSFDBUFE͕"OESPJE͔Β֎͞Ε͍ͯΔ͕ɺ جຊతʹ͸Ҿ͖ଓ͖'SBHNFOUΛ༻͍Δํ๏͕ਪ঑͞ Ε͍ͯΔ ˞IUUQTHJUIVCDPNBPTQNJSSPSQMBUGPSN@GSBNFXPSLT@CBTFDPNNJUDEGCD ͓Αͼ"DUJWJUZHFU-BTU/PO$POGJHVSBUJPO*OTUBODFͷ+BWBEPDࢀর ඇਪ঑ʜʁ PO3FUBJO$VTUPN/PO$POGJHVSBUJPO*OTUBODF Ͱอ࣋

Slide 48

Slide 48 text

ᶃ PO4BWF*OTUBODF4UBUF Ͱ#VOEMFʹ֨ೲ͠ɺ PO$SFBUF PO3FTUPSF*OTUBODF4UBUF Ͱ෮ݩ ᶄ TFU3FUBJO*OTUBODF USVF Λݺͼग़ͨ͠'SBHNFOU ʹσʔλΛ֨ೲ 48 ࢖͍෼͚Λߟ͑Δ্Ͱ஫ҙ͢΂͖ͳͷ͸ อ࣋ͨ͠σʔλͷʮण໋ʯ ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ

Slide 49

Slide 49 text

49 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ PO4BWF*OTUBODF4UBUFͰอ࣋ TFU3FUBJO*OTUBODF USVF Λ ݺͼग़ͨ͠'SBHNFOUͰอ࣋ ʲࢀߟʳ"QQMJDBUJPOΫϥε΍ γϯάϧτϯͰอ࣋ ߏ੒ͷมߋ ʢը໘ճసɾ΢Οϯυ΢αΠζͷมߋʣ "DUJWJUZͷഁغ ϓϩηεͷഁغ

Slide 50

Slide 50 text

50 ߏ੒ͷมߋ࣌ͷը໘ͷঢ়ଶอ࣋ʹ͍ͭͯ ᶃ PO4BWF*OTUBODF4UBUF Ͱ#VOEMFʹ֨ೲ͠ɺ PO$SFBUF PO3FTUPSF*OTUBODF4UBUF Ͱ෮ݩ ᶄ TFU3FUBJO*OTUBODF USVF Λݺͼग़ͨ͠'SBHNFOU ʹσʔλΛ֨ೲ "DUJWJUZͷഁغͱͱ΋ʹফࣦ͢Δ͕ɺ ଟྔͰεςʔτϑϧͳσʔλΛอ࣋Ͱ͖Δ "DUJWJUZͷελοΫ͕ଘࡏ͢ΔݶΓ࢒Γଓ͚Δ͕ɺ γϦΞϧԽՄೳͳগྔͷσʔλͷΈอ࣋Ͱ͖Δ

Slide 51

Slide 51 text

ը໘ͷঢ়ଶอ࣋ͷख๏Λ Ͳ͏ޮՌతʹ࢖͍෼͚Δ͔ 51

Slide 52

Slide 52 text

52 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ڈ೥·ͰͷϑϦϧ Կ΋͔΋PO4BWF*OTUBODF4UBUF Ͱอ࣋

Slide 53

Slide 53 text

53 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ UBSHFU4EL7FSTJPOΛʹҾ্͖͛Δͱʜ ʢ˞5SBOTBDUJPO5PP-BSHF&YDFQUJPOʣ

Slide 54

Slide 54 text

54 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ͜Ε͔ΒͷϑϦϧ΋ͱ͍ϥΫϚ ϙϦγʔΛ࣋ͬͯঢ়ଶอ࣋ͷख๏Λ࢖͍෼͚Δ

Slide 55

Slide 55 text

55 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ෮ݩՄೳ ෮ݩෆೳ ݕࡧ݁Ռ ৽ண঎඼Ұཡ ʢλΠϜϥΠϯʣ ग़඼தͷೖྗ಺༰ ͓஌Βͤ ৄࡉݕࡧͷ৚݅ ฤूதͷϓϩϑΟʔϧ PO4BWF*OTUBODF4UBUF Ͱ อ࣋ TFU3FUBJO*OTUBODF USVF Λ ݺͼग़ͨ͠'SBHNFOUͰอ࣋

Slide 56

Slide 56 text

56 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ෮ݩՄೳ ෮ݩෆೳ PO4BWF*OTUBODF4UBUF Ͱ อ࣋ TFU3FUBJO*OTUBODF USVF Λ ݺͼग़ͨ͠'SBHNFOUͰอ࣋ w՝୊ᶃ௿͍ίετͰޮ཰తʹ'SBHNFOUΛ࢖༻͢Δ ঢ়ଶอ࣋ͷํ๏ʹҠߦ͍ͨ͠ w՝୊ᶄͭͷը໘Ͱण໋͕ҟͳΔͭͷঢ়ଶอ࣋ͷ ख๏Λ༻͍ͨ࣌ͷ੔߹ੑΛ୲อ͍ͨ͠

Slide 57

Slide 57 text

57 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ՝୊ᶃ௿͍ίετͰޮ཰తʹ'SBHNFOUΛ࢖༻͢Δ ঢ়ଶอ࣋ͷํ๏ʹҠߦ͍ͨ͠ ͜Ε·Ͱ͸΄΅શͯͷը໘ͰGSBOLJFTBSEP*DFQJDLΛ࢖༻ IUUQTHJUIVCDPNGSBOLJFTBSEPJDFQJDL class ExampleActivity: AppCompatActivity() { @JvmField @State var foo: Foo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Icepick.restoreInstanceState(this, savedInstanceState) } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) Icepick.saveInstanceState(this, outState) } }

Slide 58

Slide 58 text

58 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ OBLBNVVV3FUBJOFS IUUQTHJUIVCDPNOBLBNVVVSFUBJOFS

Slide 59

Slide 59 text

59 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ՝୊ᶃ௿͍ίετͰޮ཰తʹ'SBHNFOUΛ࢖༻͢Δ ঢ়ଶอ࣋ͷํ๏ʹҠߦ͍ͨ͠ class ExampleActivity: AppCompatActivity() { @JvmField @Retain var foo: Foo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Retainer.bind(this) } } "OOPUBUJPO1SPDFTTPSͰ*DFQJDLͷΑ͏ʹ ϑΟʔϧυͷอ࣋Λߦ͑ΔϥΠϒϥϦΛ࡞੒

Slide 60

Slide 60 text

60 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ 7JFX.PEFM "SDIJUFDUVSF$PNQPOFOUT ՝୊ᶄͭͷը໘Ͱण໋͕ҟͳΔͭͷঢ়ଶอ࣋ͷɹ ख๏Λ༻͍ͨ࣌ͷ੔߹ੑΛ୲อ͍ͨ͠ w"DUJWJUZ'SBHNFOU͔Β6*ʹؔΘΒͳ͍ϩδοΫ ΛҾ͖ണ͕͠ɺςελϏϦςΟΛ୲อͰ͖Δͷ͕ར఺ wPO4BWF*OTUBODF4UBUF Ͱͷอ࣋ɾ෮ݩͷ੹೚΋ Ͱ͖ΔݶΓ7JFX.PEFMʹԡ͜͠Έ͍ͨʜ

Slide 61

Slide 61 text

ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ 61 TBWFE*OTUBODF4UBUFΛੜ੒࣌ʹ౉ͤΔ 7JFX.PEFM'BDUPSZΛ࡞੒ ˞IUUQTQSPBOESPJEEFWDPNDVTUPNJ[JOHUIFOFXWJFXNPEFMDGCBDGDࢀߟ abstract class StateAwareViewModel(app: Application) : AndroidViewModel(app) { abstract fun saveInstanceState(outState: Bundle) abstract fun restoreInstanceState(state: Bundle?) } class StateAwareViewModelFactory( private val application: Application, private val savedInstanceState: Bundle? ) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { return if (StateAwareViewModel::class.java.isAssignableFrom(modelClass)) { return modelClass.getConstructor(Application::class.java) .newInstance(application) .also { (it as StateAwareViewModel) .restoreInstanceState(savedInstanceState) } } else super.create(modelClass) } }

Slide 62

Slide 62 text

62 ը໘ͷঢ়ଶอ࣋ͷख๏ΛͲ͏ޮՌతʹ࢖͍෼͚Δ͔ ՝୊ᶄͭͷը໘Ͱण໋͕ҟͳΔͭͷঢ়ଶอ࣋ͷɹ ख๏Λ༻͍ͨ࣌ͷ੔߹ੑΛ୲อ͍ͨ͠ TBWFE*OTUBODF4UBUF͔Βద੾ʹঢ়ଶ͕෮ݩͤ͞Δ͔ 7JFX.PEFMଆͷςετͰ୲อͰ͖Δ w7JFX.PEFMTBWFE*OTUBODF4UBUFͱ΋อ࣋͞Ε͍ͯΔέʔε wTBWFE*OTUBODF4UBUFͷΈ͕อ࣋͞Ε͍ͯΔέʔε TBWFE*OTUBODF4UBUFΛੜ੒࣌ʹ౉ͤΔ 7JFX.PEFM'BDUPSZΛ࡞੒

Slide 63

Slide 63 text

·ͱΊ 63

Slide 64

Slide 64 text

64 ·ͱΊ wGJUT4ZTUFN8JOEPXT8JOEPX*OTFUTΛ׆༻͠ɺ γεςϜ6*ͷ഑ஔʹӨڹ͞Εͳ͍ϨΠΞ΢τΛ૊Ή wը໘ͷঢ়ଶอ࣋ͷख๏ΛޮՌతʹ࢖͍෼͚ͯߏ੒ͷɹ มߋʹڧ͍ը໘Λߏங͢Δ ʰ΢Οϯυ΢αΠζͷมߋʹڧ͍ݎ࿚ͳը໘ʱͰ ΑΓ"OESPJEΒ͍͠ߴ඼࣭ͳΞϓϦΛ ଟ࠼ͳը໘αΠζɺϚϧν΢Οϯυ΢͸"OESPJEͷಛ৭ʜ

Slide 65

Slide 65 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ