[Android WIL] 240422 ~ 240426 (ํŒ€ํ”„๋กœ์ ํŠธ ํ•œ ์ฃผ๊ฐ„์˜ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ )
๋ฐ˜์‘ํ˜•

 

 

 

 

 

๐ŸŒฑ ์›”์š”์ผ Today I Learned (์ง‘์ค‘ ์‹œ๊ฐ„: 8์‹œ๊ฐ„ 50๋ถ„)

  1. (10:00 ~ 11:00 / 1์‹œ๊ฐ„) ์ˆ™๋ จ ํŒ€ํ”„๋กœ์ ํŠธ ๋ฐœ์ œ
  2. (11:00 ~ 13:00 / 2์‹œ๊ฐ„) ์ˆ™๋ จ ํŒ€ํ”„๋กœ์ ํŠธ SA ์ž‘์„ฑ ๋ฐ ์—ญํ•  ๋ถ„๋ฐฐ
  3. (14:30 ~ 16:30 / 2์‹œ๊ฐ„) ํŒ€ํ”„๋กœ์ ํŠธ ํšŒ์˜
  4. (16:30 ~ 18:10 / 1์‹œ๊ฐ„ 40๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์‹œ์ž‘ (ํƒญ ๋ ˆ์ด์•„์›ƒ, UI, ๋…ธ์…˜ ์ˆ˜์ • ๋“ฑ)
  5. (18:10 ~ 21:30 / 2์‹œ๊ฐ„ 10๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

โ€‹

๐ŸŒฑ ํ™”์š”์ผ Today I Learned (์ง‘์ค‘ ์‹œ๊ฐ„: 11์‹œ๊ฐ„ 0๋ถ„)

  1. (10:00 ~ 13:30 / 3์‹œ๊ฐ„ 30๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ 
  2. (14:30 ~ 22:00 / 7์‹œ๊ฐ„ 30๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ (UI๊ตฌํ˜„, ํƒญ๋ ˆ์ด์•„์›ƒ ์—ฐ๊ฒฐ, ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ ๋“ฑ) ๋ฐ ํšŒ์˜

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

 

๐ŸŒฑ ์ˆ˜์š”์ผ Today I Learned (์ง‘์ค‘ ์‹œ๊ฐ„: 11์‹œ๊ฐ„ 30๋ถ„)

  1. (10:00 ~ 22:30 / 11์‹œ๊ฐ„ 30๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

 

๐ŸŒฑ ๋ชฉ์š”์ผ Today I Learned (์ง‘์ค‘ ์‹œ๊ฐ„: 8์‹œ๊ฐ„ 5๋ถ„)

  1. (10:00 ~ 12:50 / 2์‹œ๊ฐ„ 50๋ถ„) ํŒ€ํ”„๋กœ์ ํŠธ
  2. (14:00 ~ 21:00 / 6์‹œ๊ฐ„) ํŒ€ํ”„๋กœ์ ํŠธ

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

 

* ๊ธˆ์š”์ผ ๋ฐ ๋ฐœํ‘œ์ฃผ์ฐจ(์›”์š”์ผ) ๊ฐœ์ธ์ผ์ •

 

 

 

 


 

1. [์ „์ฒด] ํƒญ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„

 

๐Ÿ”จ ๋ทฐํŽ˜์ด์ €์™€ ํƒญ ๋ ˆ์ด์•„์›ƒ ๋ฐฐ์น˜ ๋ฌธ์ œ

(์™ผ์ชฝ) ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ์กฐ (์˜ค๋ฅธ์ชฝ) ํ˜„์žฌ ๊ตฌ์กฐ

  • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ชจ์–‘์€ ์™ผ์ชฝ๊ณผ ๊ฐ™์ด ๋ทฐํŽ˜์ด์ €๊ฐ€ ์ „์ฒดํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๊ณ , ํƒญ ๋ ˆ์ด์•„์›ƒ์ด ํ—ˆ๊ณต์— ๋– ์žˆ๋Š” ๋ชจ์–‘์ด๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ปจ์ŠคํŠธ๋ ˆ์ธํŠธ๋กœ ํ•ด๋‹น ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • ํŠœํ„ฐ๋‹˜๊ป˜ ์—ฌ์ญค๋ณด๋‹ˆ, ํƒญ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ด๋Ÿฐ ํ”Œ๋กœํŒ… ํ˜•ํƒœ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑด ๋ณธ ์ ์ด ์—†๋‹ค๊ณ  ํ•˜์…จ๋‹ค. ๋ณดํ†ต์€ ๋‚ด๋น„๊ฒŒ์ด์…˜์ด๋‚˜ ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ์œผ๋กœ ์ด์šฉํ•˜๊ณ ... ์ง€๊ธˆ ์šฐ๋ฆฌ ๊ณผ์ œ ๋‹จ๊ณ„์—์„  ์˜›๋‚  ๋ฐฉ์‹์ธ ํƒญ๋ ˆ์ด์•„์›ƒ์„ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฑฐ๋ผ๊ณ  ํ•œ๋‹ค.

 

  • elevation๊ณผ ๊ฐ์ข… ๋งˆ์ง„, ๋ฐฐ์น˜, ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋Œ€๊ฐ• ์œ ์‚ฌํ•˜๊ฒŒ ์ด ์ •๋„๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๊ทผ๋ฐ ๊ทธ๋ƒฅ ๋’ค์— ์žˆ๋Š” ๋ทฐํŽ˜์ด์ €์˜ ํ•˜๋‹จ margin์„ ์—†์• ๊ณ , ํƒญ ๋ ˆ์ด์•„์›ƒ์„ ๋„์šฐ๋ฉด ์ƒ๊ฐํ•œ๋Œ€๋กœ ๊ตฌ์ƒ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.
  • ํƒญ ๋ ˆ์ด์•„์›ƒ์„ ํ—ˆ๊ณต์— ๋„์šฐ๊ณ  ์•„๋ž˜๊นŒ์ง€ ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒŒ ์˜ˆ์ƒ๋ณด๋‹ค ์˜ˆ์˜์ง€ ์•Š์•„์„œ, ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

 

๐Ÿ”จ ํƒญ ๋ ˆ์ด์•„์›ƒ ์ปค์Šคํ…€ ๋ฌธ์ œ

  • ํƒญ ๋ ˆ์ด์•„์›ƒ์— ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    (1) ์•„์ด์ฝ˜๋งˆ๋‹ค์˜ ์—ฌ๋ฐฑ ๊ตฌํ˜„
    (2) ํƒญ๋ ˆ์ด์•„์›ƒ์˜ ์ „์ฒด ๋ฐฐ๊ฒฝ์„ ๋™๊ทธ๋ž€ ์ด๋ฏธ์ง€๋กœ ์„ค์ •
    (3) ํด๋ฆญ๋œ ํ˜„์žฌ ํ”„๋ž˜๊ทธ๋จผํŠธ ์•„์ด์ฝ˜์— ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ์ƒ‰์ƒ ๋ณ€๊ฒฝ / ํด๋ฆญ๋˜์ง€ ์•Š์€ ํ”„๋ž˜๊ทธ๋จผํŠธ ํšŒ์ƒ‰ ํ‘œ์‹œ
    (4) ํด๋ฆญํ•  ๋•Œ ์ž ๊น ๋‚˜์˜ค๋Š” ๋ฒ”์œ„ ๋ชจ์…˜ ์—†์• ๊ธฐ

 

(1) ์•„์ด์ฝ˜๋งˆ๋‹ค์˜ ์—ฌ๋ฐฑ ๊ตฌํ˜„

    app:tabPaddingStart="16dp" <!-- ์•„์ด์ฝ˜๊ณผ ํ…์ŠคํŠธ ์‚ฌ์ด์˜ ์™ผ์ชฝ ๊ฐ„๊ฒฉ ์„ค์ • -->
    app:tabPaddingEnd="16dp"> <!-- ์•„์ด์ฝ˜๊ณผ ํ…์ŠคํŠธ ์‚ฌ์ด์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ„๊ฒฉ ์„ค์ • -->
  • TabLayout์˜ ๊ฐ TabItem์— layout_margin ์†์„ฑ์„ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.
    ์ด๋Š” TabLayout๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ TabItem์˜ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์„ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋Œ€์‹  TabLayout์— tabPadding์„ ์ ์šฉ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

 

(2) ํƒญ๋ ˆ์ด์•„์›ƒ์˜ ์ „์ฒด ๋ฐฐ๊ฒฝ์„ ๋™๊ทธ๋ž—๊ฒŒ ์„ค์ •

  • radius๋ฅผ ์ค€ xml์„ background๋กœ ๋จน์ด๋ฉด ๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ์˜ ๋ฌธ์ œ์ ์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ์—ˆ๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ Themes.xml์— background ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ํƒญ ๋ ˆ์ด์•„์›ƒ์˜ ๋ฐฐ๊ฒฝ ๋ณ€๊ฒฝ์ด ์ ˆ๋Œ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ถ€๋ถ„์€ themes.xml์˜ background๋ฅผ ์‚ญ์ œํ•˜๋‹ˆ ๋‚˜์•„์กŒ๋‹ค.

 

(3) ํด๋ฆญ๋œ ํ˜„์žฌ ํ”„๋ž˜๊ทธ๋จผํŠธ ์•„์ด์ฝ˜์— ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ์ƒ‰์ƒ ๋ณ€๊ฒฝ / ํด๋ฆญ๋˜์ง€ ์•Š์€ ํ”„๋ž˜๊ทธ๋จผํŠธ ํšŒ์ƒ‰ ํ‘œ์‹œ

 

How to change TabLayout selected tab icon using ViewPager2

I use FragmentStateAdapter, ViewPager2, and com.google.android.material.tabs.TabLayout, and to set tab icon, I use com.google.android.material.tabs.TabLayoutMediator TabLayoutMediator( mTabAct...

stackoverflow.com

val unSelected: Int = ContextCompat.getColor(this, R.color.colorUnSelect)
        val selected: Int = ContextCompat.getColor(this, R.color.colorSelect)
        val tabLayout = binding.tlMainTapLayout

        tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab?) {
                tab?.icon?.setColorFilter(selected, PorterDuff.Mode.SRC_IN)
            }

            override fun onTabUnselected(tab: TabLayout.Tab?) {
                tab?.icon?.setColorFilter(unSelected, PorterDuff.Mode.SRC_IN)
            }

            override fun onTabReselected(tab: TabLayout.Tab?) {
                // Do nothing
            }
        })
  • selected/unselected ์ƒํƒœ๋กœ ๋‚˜๋ˆ„์–ด setColorFilter๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๋‹ค๋งŒ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๋™๊ทธ๋ผ๋ฏธ ๋ชจ์–‘ ๊ฐ•์กฐ๋Š” indicator์— xml์„ ์„ค์ •ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•ด๊ฒฐ์ด ๋ถˆ๊ฐ€ํ–ˆ๋‹ค.
  • ํŠœํ„ฐ๋‹˜์—๊ฒŒ ์—ฌ์ญค๋ณด๋‹ˆ, ์•„์˜ˆ ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ์˜ ์•„์ด์ฝ˜๊ณผ ํด๋ฆญ๋˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์•„์ด์ฝ˜์„ ๋‚˜๋ˆ„์–ด์„œ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์…จ๋‹ค. (์‚ฌ์‹ค ํƒญ ๋ ˆ์ด์•„์›ƒ์„ ๊พธ๋ฏธ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ํ˜„์—…์—์„  ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋“ฏ ํ•˜๋‹ค.)
  • ์•„์ด์ฝ˜์„ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ์˜ ์ƒํ™ฉ ์ฐธ๊ณ ์ž๋ฃŒ : ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋งํฌ

 

 

 

(4) ํด๋ฆญํ•  ๋•Œ ์ž ๊น ๋‚˜์˜ค๋Š” ๋ฒ”์œ„ ๋ชจ์…˜ ์—†์• ๊ธฐ

์ถœ์ฒ˜: minchanyoun.tistory.com

  • app:tabRippleColor="" : ํƒญ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ์˜ ์ƒ‰์ƒ ๊ฐ’
  • ์ƒ‰์ƒ์„ ํˆฌ๋ช…์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ธฐ์กด์— ํšŒ์ƒ‰์œผ๋กœ ๋œจ๋˜ ๋ฒ”์œ„ ํ‘œ์‹œ ์ด๋ฒคํŠธ๊ฐ€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.
    app:tabRippleColor="@color/colorTransparent"

 

 

 

 


 

2. [๋ฉ”์ธ] ์—ฐ๋ฝ์ฒ˜ ๊ฒ€์ƒ‰์ฐฝ ๊ตฌํ˜„

 

  • ์ฟผ๋ฆฌ ํžŒํŠธ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ → iconifiedByDefault๋ฅผ true๋กœ ํ•ด์„œ, ์•„์ด์ฝ˜์„ ๋ˆŒ๋Ÿฌ์•ผ๋งŒ ๊ฒ€์ƒ‰์ฐฝ์ด ์ž‘๋™๋˜๋˜ ๋ฌธ์ œ๋‹ค.
  • iconifiedByDefault๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฒ€์ƒ‰์ฐฝ์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
app:iconifiedByDefault="false"
android:background="@drawable/sv_search_radius"
app:queryBackground="@null"

 

 

 

 

 


 

3. [๋ฉ”์ธ] ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ ๊ตฌํ˜„

 

  • ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ ๋‚ด์˜ SVG ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ๋˜ํ•œ ์™ธ๊ณฝ ๋™๊ทธ๋ผ๋ฏธ ๋ชจ์–‘๋˜ํ•œ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ”Œ๋Ÿฌ์Šค ๋ฒ„ํŠผ์˜ ์ƒ‰์ƒ๋„ ๊ฒ€์ •์—์„œ ๋ฉ”์ธ ํ…Œ๋งˆ ์ƒ‰์ƒ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. (Tint๊ฐ€ ์ž‘๋™๋˜์ง€ ์•Š์Œ)

 

๐Ÿ”จ ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ ๋‚ด์˜ ์ •๋ ฌ ๋ฌธ์ œ

  • width์™€ height๋ฅผ wrap_content๋กœ ์ˆ˜์ •ํ•ด์ฃผ๋‹ˆ ๋ฐ”๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค.
  • ์ด ์ƒํƒœ์—์„œ๋Š” fabSize๊ฐ€ ๋จน์„๊นŒ ํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ์ž‘๋™๋˜์ง€ ์•Š์•˜๋‹ค.

 

 

๐Ÿ”จ ์™ธ๊ณฝ ๋™๊ทธ๋ผ๋ฏธ ๋ชจ์–‘, ์ƒ‰์ƒ ๋“ฑ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ (themes.xml ๋ฌธ์ œ ๋“ฑ)

 

(์™ผ์ชฝ) Xml ์ฝ”๋“œ (์˜ค๋ฅธ์ชฝ) ์ ์šฉํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ

  • float_fab_shape.xml์„ ๋งŒ๋“ค์–ด app:shapeAppearanceOverlay="@drawable/fab_shape" ๋ฅผ ์ ์šฉํ•˜๋ฉด, ๋„ค๋ชจ๋ฐ•์Šค ๋ชจ์–‘์œผ๋กœ ์—„์ฒญ ํฌ๊ฒŒ ์ ์šฉ๋˜์–ด ์ด์ƒํ•ด์กŒ๋‹ค.
  • app:maxImageSize="30dp" ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ width ๋ฐ height๋ฅผ ์„ค์ •ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ์— ๊ด€๋ จ๋œ ๋ฌธ์„œ๋ฅผ ๋งŽ์ด ์ฐพ์•„๋ณด์•˜๋‹ค. (๊ด€๋ จ ๋ฌธ์„œ)

 

 

๊ธฐ๋ณธ ์ฝ”๋“œ๋งŒ ์„ค์ •ํ•ด๋„ ์˜ค๋ฅธ์ชฝ์ด ์ถœ๋ ฅ๋œ๋‹ค.

  • ๊ทธ๋Ÿฐ๋ฐ ๊ด€๋ จ ๊ณต์‹ ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ•ด๋„ ์˜ˆ์ œ์™€๋Š” ๋‹ฌ๋ฆฌ ๋„ค๋ชจ๋‚œ ๋ฒ„ํŠผ์ด ์ƒ์„ฑ๋œ๋‹ค. ๋ฐฐ๊ฒฝ๋„ ๋ณด๋ผ์ƒ‰์ด๋‹ค.
  • ์ด๊ฑธ ๋ณด๊ณ  ๋ญ”๊ฐ€ xml์ด๋‚˜ ํ…Œ๋งˆ์˜ ๊ธฐ๋ณธ๊ฐ’ ์ž์ฒด๊ฐ€ ์ž˜๋ชป ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

  • ๋งž์•˜๋‹ค. ์›์ธ์€ themes.xml์— ๊ธฐ๋ณธ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฐ’์ด๋‹ค.
  • ์ด๋ถ€๋ถ„์˜ Material3์„ AppCompat์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ์ค„ ์•Œ์•˜์œผ๋‚˜, ๋‹ค์‹œ ์ •์ฒด๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ํ…Œ๋งˆ์˜ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์ƒ‰์ธ ์ดˆ๋ก์ƒ‰์ด ํ…Œ๋‘๋ฆฌ์— ์˜…๊ฒŒ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.
  • backgroundtint๋กœ ํ™”์ดํŠธ๋ฅผ ์ค˜๋„ ๋จน์ง€ ์•Š์•˜๋‹ค. ๋‹ค์‹œ ํ…Œ๋งˆ์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

  • themes.xml์ด ๋ชจ๋“  ์ƒ‰์ƒ๊ณผ ํ˜•ํƒœ๋ฅผ ํ†ต์ œํ•˜๊ณ  ์žˆ๋‹ค.
  • android:background๋ฅผ ์‚ฌ์šฉํ•  ๋• ํƒญ๋ ˆ์ด์•„์›ƒ์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋œจ์ง€ ์•Š์•˜๊ณ , android:colorPrimary๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ถ”์ฒœ๋˜๋Š” ๋ฐฉ์‹์ด๊ธด ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดˆ๋ก์ƒ‰ ํ”Œ๋กœํŒ…๋ฒ„ํŠผ ํ…Œ๋‘๋ฆฌ๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š์•˜๋‹ค.
  • ํ…Œ๋งˆ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์•Œ์•„์•ผ๊ฒ ๋‹ค ์ƒ๊ฐ๋˜์—ˆ๋‹ค.

 

 

 

์•ฑ ํ…Œ๋งˆ ๋ณ€๊ฒฝ  |  Android Developers

์ด Codelab์—์„œ๋Š” ์•ฑ์˜ ์ƒ‰์ƒ ํ…Œ๋งˆ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

developer.android.com

 

 

๊ท€์ฐฎ๊ฒŒ ํ…Œ๋งˆ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”์—†์ด, app:borderWidth="0dp"๋ฅผ ์ ์šฉํ•˜๋ฉด ํ…Œ๋‘๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

 

 

๐Ÿ”จ Constraint Layout ๋‚ด์—์„œ Floating Button์˜ margin์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

 

(์™ผ์ชฝ) ์ด์ƒํ•œ ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ์˜ ์œ„์น˜ (์˜ค๋ฅธ์ชฝ) useCompatPadding = "true" ์ ์šฉ ํ›„

 

 

 

 


 

4. [์ „์ฒดํŽ˜์ด์ง€] ์ „์ฒด UI ๊ตฌํ˜„

 

๐Ÿ”จ ์ƒ์„ธ ํŽ˜์ด์ง€ ์Šคํฌ๋กค๋ทฐ ์ ์šฉ

  • ์Šคํฌ๋กค๋ทฐ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค๋‹ค๊ฐ€, ์Šคํฌ๋กค๋ทฐ์˜ ํ•„์š”์„ฑ์„ ๋Š๊ปด ์ดํ›„์— ์ ์šฉํ–ˆ๋‹ค.
    ๊ธฐ์กด์— ๋งŒ๋“ค์–ด ๋‘” ๊ฒƒ๋“ค์„ ์Šคํฌ๋กค๋ทฐ ์•ˆ์— ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ์ƒ๋‹จ๋ฐ”์˜ ๋†’์ด๋Š” ์ง€์ •ํ•œ dp, ์Šคํฌ๋กค๋ฐ”์˜ height๋Š” 0dp๋ฅผ ํ•˜๋ฉด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋‚จ์€ ์˜์—ญ์„ ๋ชจ๋‘ ์ฐจ์ง€ํ•œ๋‹ค.
  • ์Šคํฌ๋กค๋ฐ”์— ๋‹ค์‹œ width/height๊ฐ€ ๋ชจ๋‘ match_parent์ธ ์ปจ์ŠคํŠธ๋ ˆ์ธํŠธ๋ทฐ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ๊ทธ ์•ˆ์— ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜๋ฉด ๋ชจ๋‘ ์ •์ƒ ์ž‘๋™๋œ๋‹ค.
  • ๊ตฌ์กฐ๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

 

 

๐Ÿ”จ ์Šคํฌ๋กค๋ฐ” none ์ฒ˜๋ฆฌ

  • android:scrollbars="none"์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์Šคํฌ๋กค๋ฐ”๋ฅผ ์ˆจ๊ฒผ๋‹ค.

 

 

๐Ÿ”จ ์œ ์ € ํŽ˜์ด์ง€ UI๊ตฌ์กฐ ๋ฐ ์„œํด ์ด๋ฏธ์ง€ ๋ทฐ

  • ์„œํด์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ•˜์˜€๊ณ , ์œ„์— ์˜ฌ๋ ค๋†จ๋˜ ์Šคํฌ๋กค๋ทฐ๋ฅผ ์ ์šฉํ•œ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ๋Š” ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

 

 

๐Ÿ”จ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ์•„์ดํ…œ

  • ์ด๋ฆ„๊ณผ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์˜ˆ์˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„  Vertical chain์ด ํ•„์š”ํ•˜๋‹ค.

 

 

๐Ÿ”จ ์„œ์น˜๋ทฐ ์ปค์Šคํ…€

  • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ปค์Šคํ…€ ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    (1) ์„œ์น˜๋ทฐ ๋‘ฅ๊ธ€๊ฒŒ
    (2) ์„œ์น˜๋ทฐ ํšŒ์ƒ‰ ํ…Œ๋‘๋ฆฌ
    (3) ์„œ์น˜๋ทฐ ํ…์ŠคํŠธ ํžŒํŠธ ์„ค์ •
  • app:closeIcon : ๊ธ€์„ ์ž‘์„ฑํ•œ ํ›„ ์˜ค๋ฅธ์ชฝ์— Xํ‘œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ง€์›Œ์ง€๋Š” ํ‘œ์‹œ
  • app:queryHint : ์„œ์น˜๋ทฐ ํ…์ŠคํŠธ ํžŒํŠธ ์„ค์ •, ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๊ธ€์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ์•„๋งˆ ํ…์ŠคํŠธ๊ฐ€ ํฐ์ƒ‰์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์„œ๊ฐ€ ์•„๋‹๊นŒ ์˜ˆ์ƒํ•œ๋‹ค.
  • app:queryBackground : ์„œ์น˜๋ทฐ์˜ ๋ฐฐ๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”จ ๋งˆ์ดํŽ˜์ด์ง€ Edittext ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • ๋ฐ ์ˆ˜์ • ๊ธˆ์ง€

android:text="sysdocu"    // ๊ธฐ๋ณธ ์ž…๋ ฅ๊ฐ’ 
android:editable="false"    // ์“ฐ๊ธฐ(์ˆ˜์ •) ๊ธˆ์ง€

 

๐Ÿ”จ ์•ฑ ์•„์ด์ฝ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • (1) ์ด๋ฏธ์ง€ ๋“ฑ๋ก: res - new - Image Asset - Name ์„ค์ • - Path ์„ค์ • - Resize๋กœ ์กฐ์ ˆ - Finish
  • (2) Manifest ์ˆ˜์ •: android:icon๊ณผ android:roundIcon ๋ถ€๋ถ„ ์ˆ˜์ •

 

 

๐Ÿ”จ Dialog ์ปค์Šคํ…€

 

 

 

 

 


 

5. GitHub README ์ž‘์„ฑ

 

 

  • ๊นƒํ—ˆ๋ธŒ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.

 

 

 

 

 


๊ธฐ์ˆ  ๋ฉด์ ‘

ํ”„๋ž˜๊ทธ๋จผํŠธ (Fragment)
- 'ํ”„๋ž˜๊ทธ๋จผํŠธ ๋งค๋‹ˆ์ €' ์ฐพ์•„๋ณด๊ธฐ, ์—ญํ•  ์ดํ•ดํ•˜๊ธฐ
- 'ํ”„๋ž˜๊ทธ๋จผํŠธ ํŠธ๋žœ์žญ์…˜' ์ฐพ์•„๋ณด๊ธฐ, ์—ญํ•  ์ดํ•ดํ•˜๊ธฐ
- ํ”„๋ž˜๊ทธ๋จผํŠธ ํŠธ๋žœ์žญ์…˜ ์‹œ(add, replace, remove, show, hide, attach, detach) ๋“ฑ์„ ํ•  ๋•Œ Lifecycle ๋ณ€ํ™” ๋กœ๊ทธ๋กœ ํ™•์ธ
- ์•กํ‹ฐ๋น„ํ‹ฐ์ฒ˜๋Ÿผ ๋ฐฑ์Šคํƒ์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„์„œ, addBackStack์„ ํ†ตํ•ด ๋ฐฑ์Šคํƒ์„ ๊ด€๋ฆฌํ•˜๊ฒ ๋‹ค๊ณ  ๋”ฐ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ
backํ‚ค๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์Šคํƒ์„ ์–ด๋–ป๊ฒŒ ํ•˜๊ฒ ๋‹ค ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ
- ํ”„๋ ˆ์ž„๋ ˆ์ด์•„์›ƒ๊ณผ์˜ ๊ด€๊ณ„ ( ๋ณดํ†ต์€ ํ”„๋ ˆ์ž„๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค์–ด์„œ ๋นต๊พธ ๋šซ์–ด๋†“๊ณ , ๊ฑฐ๊ธฐ๋‹ค ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋ถ™์ž„.
์š”์ฆ˜์€ ํ”„๋ ˆ์ž„๋ ˆ์ด์•„์›ƒ ๋ง๊ณ  ํ”„๋ž˜๊ทธ๋จผํŠธ์ปจํ…Œ์ด๋„ˆ๋ทฐ๋ผ๋Š” ๊ฒƒ๋„ ์‚ฌ์šฉ)

ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒ๋ช…์ฃผ๊ธฐ
- ์ฐธ๊ณ  ๋งํฌ (๋งํฌ)
- onActivityCreated๋Š” deprecated๋˜๊ณ , ์ง€๊ธˆ์€ onCreateView๋ฅผ ์”€
- ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ ์‚ฌ์ด ๊ฐ„์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ์—์„œ ๋ทฐํ™€๋”๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ 
- ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ์žฌํ™œ์šฉ ํ•˜๊ธฐ ์œ„ํ•จ / positionํ•˜๊ณ  viewtype์„ ํ†ตํ•ด์„œ ๋‚ด๋ถ€์˜ ์บ์‹œ๋‚˜ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ ํ’€์ด๋ผ๋˜๊ฐ€๋ฅผ 
- ์ด ์กด์žฌ ์ด์œ ์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์ฐพ์•„ ๋ณด๊ธฐ

๋ฉ€ํ‹ฐ ๋ทฐ ํƒ€์ž…
- ๊ฒŸ ์•„์ดํ…œ ๋ทฐํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ์ค€ ๋‹ค์Œ์— ๊ทธ ํƒ€์ž…์œผ๋กœ ๋ทฐํ™€๋”๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋จ

 

 

 

 

๐Ÿ’ญ Retrospect

๊ฐœ์ธ์‚ฌ์ •์œผ๋กœ ์ธํ•ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ํ›„๋ฐ˜๋ถ€์— ์ฐธ์—ฌ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์–ด UI ๊ตฌํ˜„ ํ˜น์€ ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๊ธฐ์ˆ  ์œ„์ฃผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ˆ™๋ จ ์ฃผ์ฐจ์—์„œ ๋ฐฐ์šด ๊ธฐ์ˆ ์„ ์ œ๋Œ€๋กœ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ํ™œ์šฉํ•ด๋ณด์ง€ ๋ชปํ•œ๊ฒŒ ์ •๋ง ๋„ˆ๋ฌด x 1000 ์•„์‰ฝ๋‹ค. ์‹ฌํ™” ์ฃผ์ฐจ ๊ฐœ์ธ ์‹œ๊ฐ„ ๋•Œ ์ฃผ๋ง๊ณผ ๋Šฆ์€ ๋ฐค ์‹œ๊ฐ„์„ ํ• ์• ํ•ด์„œ๋ผ๋„ ๋ฐ€๋ฆฐ ๋‚ด์šฉ๋“ค, ์ดํ•ด ๋ชปํ•œ ๋‚ด์šฉ๋“ค์„ ๋งˆ์Šคํ„ฐํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ํŒ€ํ”„๋กœ์ ํŠธ ๋• UI๋ณด๋‹จ ๊ธฐ์ˆ  ๊ตฌํ˜„ ์œ„์ฃผ๋กœ ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ๋‹ค.

โ€‹

 

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T