Skip to content

[AN] 안드로이드 컨벤션

SeongHoonC edited this page Jul 17, 2023 · 10 revisions

Parameter 순서

  • Context류의 parameter를 가장 앞에 위치한다.

    (Context, Activity, Fragment, View등)

  • Callback류의 parameter를 가장 뒤에 위치한다.

    (XXXListener, XXXCallback, XXXSubject등)

getTicket(context: Context, hashId: Int): Ticket
loadTicket(context: Context, hashId: Int, listener: TicketListener): Unit

Key

  • Key-Value로 활용되는 컴포넌트들의 Key는 val KEY_XXX: String로 정의한다.
  • Key로 정의된 이름의 String값은 동일하게 맞춰준다.
const val KEY_HASH_ID = "KEY_HASH_ID"
const val KEY_TICKET = "KEY_TICKET"

Activity

  • Activity Intent에 KEY_를 넣어주는 경우, 해당 Activity에 startActivity() 혹은 getIntent()를 구현하고 이를 사용한다.
  • putExtra는 apply를 사용한다.
companion object {
    fun startActivity(context: Context, @DrawableRes posterResourceId: Int) {
        val intent = Intent(context, TicketDetailActivity::class.java).apply{
          putExtra(KEY_POSTER_RESOURCE_ID, posterResourceId)
        }
        context.startActivity(intent)
    }
}

companion object {
    fun getIntent(context: Context, festaId: String, festaName: String): Intent {
        return Intent(context, SelectTicketActivity::class.java).apply{
          putExtra(KEY_FESTA_ID, festaId)
          putExtra(KEY_FESTA_NAME, festaName)
        }
    }
}

Fragment

companion object{
    fun newInstance(user: User): UserFragment {
		val fragment = UserFragment()
		fragment.arguments = Bundle().apply{
			putParcelable(KEY_USER, user)
		}
		return fragment
    }
}

기타

  • startActivity() / getIntent() / newInstance()에서 쓰이는 Key는 항상 private val로 만든다.

Line

  • 1줄에 100자를 넘지 않도록 작성한다.
  • 코드간의 간격은 2줄이상 간격이 발생하지 않도록 한다.(최대 1줄 줄바꿈)
  • 파라미터 개수와 상관없이 100자 이상이면 개행한다.

Parameter

  • 파라미터가 2개 이상이면 이름을 명시한다.
  • 줄바꿈이 필요하면 모든 파라미터를 줄바꿈한다.

Method chain

  • Builder등 여러 함수를 chaining으로 사용하면서 줄바꿈이 필요한 경우, .전에 줄바꿈한다.
ImageLoader.load(user.getProfileUrl())
        .placeholder(R.drawable.img_user_placeholder)
        .fitCenter()
        .into(binding.ivUser)

Util/Extension

  • 특정기능을 수행하거나 상태를 관리하거나 분리되어 동작을 수행하는 클래스에 대한 사용처별 이름을 정의한다.

Util

  • val AAA등으로 쓰이는 여러곳에서 사용되는 util성 기능을 모아둔 오브젝트
  • aa.bb.cc.util 패키지에 모두 모아둔다.
  • 예) DateFormatUtil, PixelUtil, BitmapUtil

Naming Rules

Package

  • 패키지 이름은 소문자로 작성한다. 연결된 단어를 붙여서 사용해야 하는 경우 모두 소문자로 작성한다.
package com.festago.domain

  • camelCase 사용 금지, underscore(_) 사용 금지
// WRONG!
package com.festa_go.domain
// WRONG!
package com.festaGo.domain

함수 이름

format 설명
load<MODEL_NAME>() 서버에서 데이터 불러올 때
save<MODEL_NAME>() 서버에 저장할 때
get<MODEL_NAME>() 리턴값이 있는 데이터를 불러올 때
find<MODEL_NAME>() 특정 객체를 찾을 때
get<MODEL_NAME>s() 복수형을 가져올 때 s 붙이기
init() 한 번만 초기화할 때
setUp() 여러번 초기화(세팅)할 때

Class

format class 종류
<PRODUCT_NAME>Application.kt application
Activity.kt activity
Adapter.kt adapter
Fragment.kt fragment
.kt model
Provider.kt content provider
Service.kt service
Receiver.kt broadcast receiver
Utils.kt utility
View.kt custom view

Resource Naming Rules

Layout

format layout
activity_<ACTIVITY_NAME>.xml Activity layout
fragment_<FRAGMENT_NAME>.xml Fragment layout
dialog_<DIALOG_NAME>.xml Dialog layout
view_<VIEW_NAME>.xml CustomView layout
item_<PARENT__NAME>.xml RecyclerView, GridView, ListView등의각 항목에 해당하는 layout
layout_<LAYOUT_NAME>.xml re-useable layout

Menu

format 설명
<MENU_NAME>.xml option menu
popup_<MENU_NAME>.xml popup menu

ID

  • <WHAT><DESCRIPTION> (CamelCase로 작성한다)
  • View의 대문자를 축약하여 <WHAT>의 Prefix로 사용한다.
  • 아래 이름규칙을 적용한다.
  1. Android의 View는 CamelCase의 대문자를 축약한 형태로 정한다.

TextView -> tv

  1. 만약 View의 이름이 Space, Switch와 같이 1개의 대문자만 존재한다면 모두 소문자인 아이디로 정한다.

Switch -> switch

(만약 1개의 xml에 같은 여러 CustomView가 존재한다면 <WHAT>_<DESCRIPTION>의 형태로 정한다.)

  1. 아래표에 해당 View의 Prefix가 정의되어 있지 않다면 팀에서 상의해서 이름을 정한뒤 추가한다.

WHAT

Prefix View
tv TextView
iv ImageView
cb CheckBox
rv RecyclerView
et EditText
nsv NestedScrollView
switch Switch
btn Button

Drawable

  • <WHAT>(_<WHERE>)_<DESCRIPTION>(_<SIZE>)
  • 이미지가 여러군데에서 활용될 경우, <WHERE>는 생략 가능하다.
  • 이미지의 크기가 1개밖에 없는 경우, <SIZE>는 생략 가능하다.

What

Prefix 설명
btn_ 버튼으로 쓰이는 이미지
ic_ 버튼이 아닌 화면에 보여지는 이미지
bg_ 버튼이 아닌 화면에 보여지는 이미지
img_ 실제사진이거나 아이콘형태가 아닌 일러스트형태의 이미지
div_ divider로 활용되는 이미지

Selector

  • selector xml 이름은 drawable 명명 규칙을 따른다.
  • 배경이나 버튼에서 View의 상태에 따라서 drawable이 변해야 하는 경우에 대한 이름은 아래와 같다.
Suffix 상태
_normal Normal
_pressed Pressed
_focused Focused
_disabled Disabled
_selected Selected

Dimension

  • 여러 군데에서 재사용되는 개념이라면 변수로 정의해서 @dimen/xxx와 같이 사용
  • 그렇지 않다면 명시적으로 16dp와 같이 작성

Margin/Padding

name format 종류
space_ margin, padding
특정 화면에서 위의 값을 따르지 않는경우

String

  • name = <WHERE>_<WHAT>_<DESCRIPTION>
  • <WHERE>는 패키지 이름이다.
  • 여러 패키지에서 사용될 예정이면 <WHERE>all 이다.
what 설명
title ActionBar title
action ActionBar button text
tab ActionBar.Tab text
btn button
empty empty view
hint the of EditText/ AutoCompleteTextView
label static TextView
toast toast
dialog_title dialog
dialog_msg dialog
dialog_action dialog button
msg log or some other stuff
contextual contextual menu item
popup popup menu item
error error message

String-array

  • name = <ARRAY_NAME>_array

예시

  • main_permission_dialog_camera_title: 카메라권한을 요구하는 Dialog의 제목
  • main_permission_dialog_camera_description: 카메라권한을 요구하는 Dialog의 설명내용
  • all_yes: 네
  • all_ok_understand: 여러 Dialog에서 네, 알겠습니다로 쓰이는 공통의 텍스트

문단

  • 문단형태의 긴 문자열로 개행(\\\\n)이 필요한 경우, \\\\n을 다음줄의 앞에 쓴다.
 <string name="sample">문단 첫번째줄
        \\n문단 두번째줄
        \\n문단 세번째줄</string>

상수

  • 모두 대문자로 SNAKE_CASE 로 작성한다.