Skip to content

Latest commit

ย 

History

History
353 lines (262 loc) ยท 14.9 KB

File metadata and controls

353 lines (262 loc) ยท 14.9 KB

Kotlin / Android Platform

Resource

Test Convention

๐Ÿ“ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ๋ผ์ธ

๋ณธ ์ปจ๋ฒค์…˜ ๋ฌธ์„œ๋Š” PRNDcompany/android-style-guide ์˜ Kotlin.md ๋ฐ Resource.md๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1. ์ผ๋ฐ˜ ์›์น™

  • ๊ธฐ์กด ์ปจ๋ฒค์…˜ ์œ ์ง€: ํ˜„์žฌ ๋ฌธ์„œ์— ๋ช…์‹œ๋œ ๋ชจ๋“  ๊ธฐ์กด ์ปจ๋ฒค์…˜์€ ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์‹ ๊ทœ ์ปจ๋ฒค์…˜ ์ถ”๊ฐ€: ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ปจ๋ฒค์…˜์„ ๋…ผ์˜ํ•˜๊ณ  ๋ณธ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Kotlin ์ฝ”๋“œ ์ปจ๋ฒค์…˜

2.1. Boolean ๋น„๊ต

  • if (a?.b?.isTraded ?: false) ๋ฐฉ์‹๋ณด๋‹ค๋Š” if (a?.b?.isTraded == true) ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ช…์‹œ์ ์ธ ๋น„๊ต๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

2.2. Custom Accessor vs Function

  • *ํ–‰๋™(Action)**์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ๋…์ด๋ผ๋ฉด function์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • *์ƒํƒœ๋‚˜ ๊ฐ’ ๋“ฑ ์ •๋ณด(State/Value)**๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐœ๋…์ด๋ผ๋ฉด custom accessor(์†์„ฑ)๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ์กฐ: Kotlin: should I define Function or Property?

2.4. Naming Rules

2.4.1. Package ์ด๋ฆ„

  • package ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: package kr.co.prnd.domain
  • underscore(_)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • //warning package kr.co.prnd.domain_module
  • ์˜ˆ์™ธ์ ์œผ๋กœ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ๋‹จ์–ด๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” camelCase๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: package com.example.myProject

2.4.2. LiveData ๋ณ€์ˆ˜๋ช…

  • XML์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ ์‹œ ์‚ฌ์šฉ๋˜๋Š” LiveData์˜ ๋ณ€์ˆ˜๋ช…์€ xxxEvent๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ์กฐ: Google Android Jetpack Compose samples (Blueprint)

2.4.3. ํ•จ์ˆ˜ ์ด๋ฆ„

  • ViewModel์„ observe()ํ•  ๋•Œ ๋ชจ์•„ ๋†“๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„:

    • setupXXX()
  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„:

    • fetchXXX()
  • ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„:

    • saveXXX()
  • Return ๊ฐ’์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„:

    • getXXX()
  • ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„:

    • findXXX()
  • ๋ณต์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๋’ค์— s๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.

    • getBrands() // O
    • getBrandList() // X
  • Raw ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ enum์„ ์ฐพ์„ ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„์€ find()๋กœ ํ•ฉ๋‹ˆ๋‹ค.

    enum class Color {
        RED, BLUE, GREEN;
    
        fun find(rawColor: String): Color = when (rawColor) {
            "red" -> RED
            "blue" -> BLUE
            "green" -> GREEN
            else -> throw IllegalArgumentException("invalid color: $rawColor")
        }
    }

2.5. Listener Naming

2.5.1. Listener ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„

  • function์„ 1๊ฐœ๋งŒ ๊ฐ€์ง„ ๊ฒฝ์šฐ: fun interface OnXXXXListener
  • function์„ 2๊ฐœ ์ด์ƒ ๊ฐ€์ง„ ๊ฒฝ์šฐ: interface XXXListener

2.5.2. on[๋ช…์‚ฌ][๋™์‚ฌ]() (ํ˜„์žฌํ˜•)

  • Publisher(์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ฃผ์ฒด)๊ฐ€ ์ด๋ฒคํŠธ๋งŒ ์ „๋‹ฌํ•˜๊ณ  Listener๊ฐ€ ์ „์ ์ธ ์ฑ…์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ๋ฅผ handleํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ listenํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์ผ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: fun onClick(), fun onFocusChange(), fun onScrollChange(), fun onAnimationStart(), fun onTextChange()

2.5.3. on[๋ช…์‚ฌ][๋™์‚ฌ ๊ณผ๊ฑฐํ˜•]()

  • Publisher๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  Listener์—๊ฒŒ ํ•ด๋‹น ๋™์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ๋ฆด ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๋™์ž‘์„ ํ•˜๊ณ  ๋‚˜์„œ ์ด ๋™์ž‘์ด ์ผ์–ด๋‚ฌ์Œ์„ Listener์—๊ฒŒ ์•Œ๋ ค์ค„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • onEach(), doOnXXX() ๊ฐœ๋…์ฒ˜๋Ÿผ ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ interceptํ•ด์„œ ์“ธ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ž‘์„ ํ•œ ๋’ค์— Listener๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ๊ณผ๊ฑฐํ˜•์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: fun onScrollStateChanged(), fun onTextChanged()

2.5.4. ๊ธฐํƒ€ Listener ๊ทœ์น™

  • Listener๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณณ์—์„œ ๊ณผ๊ฑฐํ˜• ์—ฌ๋ถ€์— ๋”ฐ๋ผ, ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ง์•„์•ผ ํ•˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.6. Formatting

2.6.1. ๊ฐœํ–‰

  • ์ƒ์„ฑ์ž, ํ•จ์ˆ˜์—์„œ Parameter๋ฅผ ์ •์˜ํ•  ๋•Œ ํ•œ ์ค„๋กœ ์ •์˜ ๊ฐ€๋Šฅํ•˜๋ฉด ํ•œ ์ค„๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ•œ ์ค„๋กœ ์ •์˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ๊ฐ parameter๋ณ„๋กœ ๊ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2.6.2. When Statement

  • ํ•œ ์ค„์— ๋“ค์–ด๊ฐ€๋Š” when ๋ถ„๊ธฐ๋Š” ์ค‘๊ด„ํ˜ธ({})๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    when (value) {
        0 -> return
        // ...
    }
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์กฐ๊ฑด์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ >๋ฅผ ํฌํ•จํ•œ ๋ธ”๋ก์€ ๋‹ค์Œ ์ค„๋กœ ๋‚ด๋ ค์„œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    when (value) {
        foo -> // ...
        bar,
        baz     -> return
    }

3. Android Resource ์ปจ๋ฒค์…˜

3.1. Layout

3.1.1. Layout ํŒŒ์ผ ์ด๋ฆ„ (<WHAT>_<WHERE>)

WHAT Prefix ์„ค๋ช…
activity_ Activity์—์„œ ์“ฐ์ด๋Š” layout
fragment_ Fragment์—์„œ ์“ฐ์ด๋Š” layout
dialog_ Dialog์—์„œ ์“ฐ์ด๋Š” layout
view_ CustomView์—์„œ ์“ฐ์ด๋Š” layout
item_ RecyclerView, GridView, ListView ๋“ฑ ViewHolder์— ์“ฐ์ด๋Š” layout
layout_ <include/>๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ณตํ†ต์˜ layout
  • ์˜ˆ์‹œ:
    • activity_main.xml: MainActivity์˜ layout
    • fragment_request.xml: RequestFragment์˜ layout
    • dialog_contact.xml: ๋ฌธ์˜์•ˆ๋‚ด Dialog์˜ layout
    • view_rating.xml: ์ปค์Šคํ…€์œผ๋กœ ๋งŒ๋“  RatingView์˜ layout
    • item_my_car.xml: ๋‚ด ์ฐจ๋Ÿ‰ ๋ชฉ๋ก์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ๊ฐ์˜ item์˜ layout
    • layout_dealer_review.xml: ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋”œ๋Ÿฌ ๋ฆฌ๋ทฐ layout

3.1.2. ID (<WHAT>_<DESCRIPTION>)

  • View์˜ ๋Œ€๋ฌธ์ž๋ฅผ ์ถ•์•ฝํ•˜์—ฌ <WHAT>์˜ Prefix๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์•„๋ž˜ ์ด๋ฆ„ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • Android์˜ View๋Š” CamelCase์˜ ๋Œ€๋ฌธ์ž๋ฅผ ์ถ•์•ฝํ•œ ํ˜•ํƒœ๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ์‹œ: TextView -> tv_
    • ๋งŒ์•ฝ View์˜ ์ด๋ฆ„์ด Space, Switch์™€ ๊ฐ™์ด 1๊ฐœ์˜ ๋Œ€๋ฌธ์ž๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ชจ๋‘ ์†Œ๋ฌธ์ž์ธ ์•„์ด๋””๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ์‹œ: Switch -> switch_
    • CustomView๋Š” ์ „์ฒด View์˜ ์ด๋ฆ„์„ snake_case ์ด๋ฆ„์œผ๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ์‹œ: MyCustomView -> my_custom_view
      • (๋งŒ์•ฝ 1๊ฐœ์˜ xml์— ๊ฐ™์€ ์—ฌ๋Ÿฌ CustomView๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด <WHAT>_<DESCRIPTION>์˜ ํ˜•ํƒœ๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.)
    • ์•„๋ž˜ ํ‘œ์— ํ•ด๋‹น View์˜ Prefix๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํŒ€์—์„œ ์ƒ์˜ํ•˜์—ฌ ์ด๋ฆ„์„ ์ •ํ•œ ๋’ค ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      View Prefix
      TextView tv_
      ImageView iv_
      CheckBox cb_
      RecyclerView rv_
      EditText et_
      ProgressBar pb_
      FrameLayout fl_
      NestedScrollView nsv_
      Space space_
      Switch switch_
      AbcDeFgh adf_
      Abcdef abcdef_
      MyCustomView my_custom_view
      YourView your_view
  • ๊ธฐํƒ€:

    • ํ•ด๋‹น View๋ฅผ ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ์ƒ๊ด€์—†์ด VISIBLE/GONE ๋“ฑ์˜ View์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด view_xxx๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„ํŠผ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ View๋Š” ImageView, TextView๋กœ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (Button, ImageButton์€ ์กด์žฌ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Œ)
  • ์˜ˆ์‹œ:

    • iv_close: ๋‹ซ๊ธฐ ImageView
    • tv_select: ์„ ํƒ TextView
    • rv_car_list: ์ž๋™์ฐจ ๋ชฉ๋ก RecyclerView
    • view_etc_model: ๊ธฐํƒ€ ๋ชจ๋ธ ํ™”๋ฉด LinearLayout

3.2. Drawable

3.2.1. Drawable ํŒŒ์ผ ์ด๋ฆ„ (<WHAT>(_<WHERE>)_<DESCRIPTION>(_<SIZE>))

  • ์ด๋ฏธ์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ํ™œ์šฉ๋  ๊ฒฝ์šฐ, <WHERE>๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ 1๊ฐœ๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ, <SIZE>๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
What Prefix ์„ค๋ช…
ic_ ๋ฒ„ํŠผ์ด ์•„๋‹Œ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ์ด๋ฏธ์ง€ (์•„์ด์ฝ˜ ํ˜•ํƒœ)
bg_ ๋ฒ„ํŠผ์ด ์•„๋‹Œ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ์ด๋ฏธ์ง€ (๋ฐฐ๊ฒฝ ํ˜•ํƒœ)
img_ ์‹ค์ œ ์‚ฌ์ง„์ด๊ฑฐ๋‚˜ ์•„์ด์ฝ˜ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์ผ๋Ÿฌ์ŠคํŠธ ํ˜•ํƒœ์˜ ์ด๋ฏธ์ง€
div_ divider๋กœ ํ™œ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€

3.2.2. Selector ์ด๋ฆ„

  • ๋ฐฐ๊ฒฝ์ด๋‚˜ ๋ฒ„ํŠผ์—์„œ View์˜ ์ƒํƒœ์— ๋”ฐ๋ผ drawable์ด ๋ณ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ด๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ƒํƒœ Suffix ์„ค๋ช…
_normal Normal ์ƒํƒœ
_pressed Pressed ์ƒํƒœ
_focused Focused ์ƒํƒœ
_disabled Disabled ์ƒํƒœ
_selected Selected ์ƒํƒœ

3.2.3. Background Drawable ์ด๋ฆ„

  • ๋ฐฐ๊ฒฝ์ƒ‰์ด pressed ์ƒํƒœ์— ๋”ฐ๋ผ white -> sky_blue๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ: bg_white_to_sky_blue.xml
  • ๋ฐฐ๊ฒฝ์ด white ์ƒ‰์˜ 24dp๋กœ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ์šฐ: bg_white_radius_24dp.xml
  • ๋ฐฐ๊ฒฝ์ด ํˆฌ๋ช…ํ•˜๋ฉฐ ๋ฐฐ๊ฒฝ์˜ ์„ ๋งŒ์„ sky_blue ์ƒ‰์˜ 8dp๋กœ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ์šฐ: bg_stroke_sky_blue_radius_8dp.xml

3.2.4. ๊ธฐํƒ€ Drawable ๊ทœ์น™

  • img_xxx์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ tinypng์—์„œ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ธ ๋’ค์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (GitHub imgbot์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ)
  • ๋Œ€๋ถ€๋ถ„ ์šฉ๋Ÿ‰์ด ํฐ ํŒŒ์ผ์ด์–ด์„œ xxxhdpi์—๋งŒ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
    • btn_call_normal.png: ์ „ํ™” ๊ฑธ๊ธฐ ๋ฒ„ํŠผ ์ด๋ฏธ์ง€
    • btn_call_pressed.png: ์ „ํ™” ๊ฑธ๊ธฐ ๋ฒ„ํŠผ ๋ˆŒ๋ ธ์„ ๋•Œ์˜ ์ด๋ฏธ์ง€
    • btn_call.xml: ์ „ํ™” ๊ฑธ๊ธฐ ๋ฒ„ํŠผ ์ด๋ฏธ์ง€์˜ selector xml
    • ic_dealer_gift.png: ๋”œ๋Ÿฌ๊ฐ€ ๋ณด๋‚ด์ค€ ๊ธฐํ”„ํ‹ฐ์ฝ˜์„ ๋ณด์—ฌ์ค„ ๋•Œ ํ‘œ์‹œ๋˜๋Š” ์ด๋ฏธ์ง€
    • img_splash_chart.png: ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ง€๋Š” ์ฐจํŠธ ์ด๋ฏธ์ง€

3.3. Dimension

3.3.1. Dimension ์ด๋ฆ„

  • ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ด๋ผ๋ฉด ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•˜์—ฌ @dimen/xxx์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ 16dp์™€ ๊ฐ™์ด XML ์ฝ”๋“œ์— ์ง์ ‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

3.3.2. Margin/Padding4

  • ๋Œ€๋ถ€๋ถ„์˜ margin/padding์€ ์•„๋ž˜ ์ •์˜๋œ space_xxx๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • <dimen name="space_small">12dp</dimen>
    • <dimen name="space_median">16dp</dimen>
    • <dimen name="space_s_large">18dp</dimen>
    • <dimen name="space_large">20dp</dimen>
    • <dimen name="space_x_large">24dp</dimen>
  • ๊ทธ ์™ธ์— ํŠน์ • ํ™”๋ฉด์—์„œ ์œ„์˜ ๊ฐ’์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, <WHERE>_<DESCRIPTION>_<WHAT>์˜ ๊ทœ์น™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      • <dimen name="register_car_item_car_model_start_padding">40dp</dimen>
      • <dimen name="register_car_item_grade_start_padding">56dp</dimen>
      • <dimen name="register_car_item_car_detail_start_padding">72dp</dimen>
  • 2๋ฒˆ ์ด์ƒ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ๋Š” dimen์— ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•์ œํ•˜๊ณ , 1๋ฒˆ๋งŒ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ์—๋Š” XML ์ฝ”๋“œ์— ์ง์ ‘ ๋„ฃ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

3.3.3. Height/Size

  • ๋†’์ด๋งŒ ์ง€์ •ํ•  ๋•Œ๋Š” height, 1:1 ๋น„์œจ๋กœ ๊ฐ™์€ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๋•Œ๋Š” size๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      • <dimen name="toolbar_height">56dp</dimen>
      • <dimen name="register_input_view_default_height">280dp</dimen>
      • <dimen name="register_input_view_collapse_height">200dp</dimen>
      • <dimen name="dealer_profile_image_size">48dp</dimen>

3.4. String

3.4.1. String ์ด๋ฆ„ (<WHERE>_<DESCRIPTION>)

  • ํŠน์ • ํ™”๋ฉด์—์„œ ์“ฐ์ด๋Š” ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ๊ณตํ†ต์œผ๋กœ ์žฌ์‚ฌ์šฉ๋  ํ…์ŠคํŠธ๋ผ๋ฉด all_<DESCRIPTION>์œผ๋กœ ์ด๋ฆ„์„ ์ง“์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
    • permission_dialog_camera_title: ์นด๋ฉ”๋ผ ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜๋Š” Dialog์˜ ์ œ๋ชฉ
    • permission_dialog_camera_description: ์นด๋ฉ”๋ผ ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜๋Š” Dialog์˜ ์„ค๋ช… ๋‚ด์šฉ
    • all_yes: ๋„ค
    • all_ok_understand: ์—ฌ๋Ÿฌ Dialog์—์„œ ๋„ค, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค๋กœ ์“ฐ์ด๋Š” ๊ณตํ†ต์˜ ํ…์ŠคํŠธ

3.4.2. ๋ฌธ๋‹จ

  • ๋ฌธ๋‹จ ํ˜•ํƒœ์˜ ๊ธด ๋ฌธ์ž์—ด๋กœ ๊ฐœํ–‰(\n)์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, \n์„ ๋‹ค์Œ ์ค„์˜ ์•ž์— ์”๋‹ˆ๋‹ค.

    <string name="sample">๋ฌธ๋‹จ ์ฒซ๋ฒˆ์งธ์ค„
        \\n๋ฌธ๋‹จ ๋‘๋ฒˆ์งธ์ค„
        \\n๋ฌธ๋‹จ ์„ธ๋ฒˆ์งธ์ค„</string>

3.5. Theme/Style

3.5.1. ํŒŒ์ผ ์œ„์น˜ ๋ฐ ์‚ฌ์šฉ ๊ทœ์น™

  • Theme๋Š” themes.xml, Style์€ styles.xml์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • 1๋ฒˆ๋งŒ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ์—๋Š” style์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋‹จ, ์•ž์œผ๋กœ ์žฌ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋Šฅ)
  • ๋ชจ๋“  style์€ parent๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

3.5.2. Naming

  • style์˜ ์ด๋ฆ„์€ parent์˜ ์ด๋ฆ„ ํŒจํ„ด๊ณผ ๋งž์ถฅ๋‹ˆ๋‹ค.

    <style name="Widget.HeyDealer.Button" parent="@style/Widget.AppCompat.Button">
    </style>
  • parent์—์„œ ์ผ๋ถ€ ๋‚ด์šฉ๋งŒ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ, parent ์ด๋ฆ„ ๋’ค์— ๋‹ฌ๋ผ์ง„ ๋‚ด์šฉ์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

    <style name="Theme.HeyDealer.Transparent" parent="Theme.HeyDealer">
    </style>
  • Base Style๊ณผ Theme์˜ ๊ฒฝ์šฐ๋Š” ์•ž์— Base๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.XML

    <style name="Base.Theme" parent="..." />
    <style name="Base.Theme.Transparent">...</style>
    
    <style name="HeyDealerTheme" parent="Base.Theme">...</style>
    <style name="HeyDealerTheme.Transparent" parent="Base.Theme.Transparent" />
    
    <style name="Base.TextAppearance.HeyDealer" parent="...">...</style>
    <style name="Base.TextAppearance.HeyDealer.Headline">...</style>
    <style name="TextAppearance.HeyDealer.Headline1" parent="Base.TextAppearance.HeyDealer.Headline">...</style>
    <style name="TextAppearance.HeyDealer.Headline2" parent="Base.TextAppearance.HeyDealer.Headline">...</style>

3.5.3. Attribute

  • Attribute ์ด๋ฆ„์€ camelCase๋กœ ํ•ฉ๋‹ˆ๋‹ค.XML

    <attr name="numStars" format="integer" />
  • ๊ธฐ์กด์— ์ •์˜๋˜์–ด ์žˆ๋Š” android:xxx์™€ ๊ฐ™์€ ๋™์ž‘์„ ์œ ๋„ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ํƒœ๊ทธ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.XML

    <declare-styleable name="SpannedGridLayoutManager">
        <attr name="android:orientation" />
        </declare-styleable>

3.6. ๊ธฐํƒ€ Resource ๊ทœ์น™

  • android:xxxLeft/android:xxxRight ๋Œ€์‹  **android:xxxStart/android:xxxEnd*๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋ชจ๋“  Left/Right ์‚ฌ์šฉ ๋ถ€๋ถ„์— ์ ์šฉ)