Slide 1

Slide 1 text

ContextThemeWrapperͰ themeΛΑΓݡ͘ potatotips #69 2020/04/27 rmakiyama

Slide 2

Slide 2 text

ɹɹࣗݾ঺հ •຀ࢁྎ •Radiotalkגࣜձࣾ •AndroidΤϯδχΞ • @_rmakiyama • rmakiyama

Slide 3

Slide 3 text

theme × ContextThemeWrapper

Slide 4

Slide 4 text

theme

Slide 5

Slide 5 text

theme """ … "

Slide 6

Slide 6 text

theme """ <item name="colorPrimary">@color/app_purple_500"</item> <item name="colorPrimaryVariant">@color/app_purple_700"</item> <item name="colorSecondary">@color/app_teal_500"</item> <item name="colorSecondaryVariant">@color/app_teal_700"</item> " UIFNFBUUSJCVUFT

Slide 7

Slide 7 text

theme attributes

Slide 8

Slide 8 text

theme attributes """ <item name=“colorSecondary">@color/app_purple_500"</item> … " """ <item name=“colorSecondary">@color/app_purple_200"</item> … "

Slide 9

Slide 9 text

theme attributes """ <item name=“colorSecondary">@color/app_purple_500"</item> … " """ <item name=“colorSecondary">@color/app_purple_200"</item> … "

Slide 10

Slide 10 text

theme attributes tips

Slide 11

Slide 11 text

theme attributes tips

Slide 12

Slide 12 text

ContextThemeWrapper

Slide 13

Slide 13 text

ContextThemeWrapper java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.Activity

Slide 14

Slide 14 text

ContextThemeWrapperͱ͸ l"DPOUFYUXSBQQFSUIBUBMMPXTZPV UPNPEJGZPSSFQMBDFUIFUIFNFPGUIFXSBQQFEDPOUFYUl SFGIUUQTEFWFMPQFSBOESPJEDPNSFGFSFODFBOESPJEWJFX$POUFYU5IFNF8SBQQFS

Slide 15

Slide 15 text

ContextThemeWrapperͱ͸ ςʔϚΛஔ͖׵͑ΒΕΔΑʂ

Slide 16

Slide 16 text

ςʔϚΛஔ͖׵͑ͯΈΔ ϓϩεςʔλεʹͳͬͨΒ *NBHF7JFXͷ
 CBDLHSPVOEͷ৭Λม͑Δ

Slide 17

Slide 17 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ <item name="colorPrimary">@color/app_purple_500"</item> … " """

Slide 18

Slide 18 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ <item name="colorPrimary">@color/app_purple_500"</item> … " <item name="colorPrimary">@color/app_orange_500#</item> … #

Slide 19

Slide 19 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ class ProCaseFragment : DaggerFragment(R.layout.fragment_pro_case) { @Inject lateinit var status: UserStatusSetting override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState) } }

Slide 20

Slide 20 text

ςʔϚΛஔ͖׵͑ͯΈΔ val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState)

Slide 21

Slide 21 text

ςʔϚΛஔ͖׵͑ͯΈΔ val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState)

Slide 22

Slide 22 text

ςʔϚΛஔ͖׵͑ͯΈΔ val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState)

Slide 23

Slide 23 text

ςʔϚΛஔ͖׵͑ͯΈΔ val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState)

Slide 24

Slide 24 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ <item name="colorPrimary">@color/app_purple_500"</item> … " <item name="colorPrimary">@color/app_orange_500"</item> … " """

Slide 25

Slide 25 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ class ProCaseFragment : DaggerFragment(R.layout.fragment_pro_case) { @Inject lateinit var status: UserStatusSetting override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState) } }

Slide 26

Slide 26 text

ςʔϚΛஔ͖׵͑ͯΈΔ """ class ProCaseFragment : DaggerFragment(R.layout.fragment_pro_case) { @Inject lateinit var status: UserStatusSetting override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val themedInflater: LayoutInflater = if (status.isProMode) { inflater.cloneInContext( ContextThemeWrapper(requireContext(), R.style.AppTheme_Pro) ) } else inflater return super.onCreateView(themedInflater, container, savedInstanceState) } }

Slide 27

Slide 27 text

·ͱΊ • theme attributesΛ׆༻͠Α͏ • ContextThemeWrapperΛ׆༻͠Α͏

Slide 28

Slide 28 text

appendix • https:"//github.com/rmakiyama/android-theme-study • https:"//mixi-inc.github.io/AndroidTraining/introductions/1.04.basic- knowledge.html#context%E3%81%A8%E3%81%AF%EF%BC%9F • https:"//developer.android.com/reference/android/view/ContextThemeWrapper • https:"//developer.android.com/guide/topics/ui/themes • https:"//speakerdeck.com/nickbutcher/developing-themes-with- style-7d0571e3-6008-4ec5-99c6-aa5669520124