-
Notifications
You must be signed in to change notification settings - Fork 8
[AN] 안드로이드 컨벤션
SeongHoonC edited this page Jul 17, 2023
·
10 revisions
-
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 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에
KEY_
를 넣어주는 경우, 해당 Fragment에newInstance()
를 구현하고 이를 사용한다. -
Fragment 생성자의 Parameter로 넘기지 않는다.
Best Practice to Instantiate Fragments with Arguments in Android
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
로 만든다.
- 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
-
val AAA
등으로 쓰이는 여러곳에서 사용되는 util성 기능을 모아둔 오브젝트 -
aa.bb.cc.util
패키지에 모두 모아둔다. - 예)
DateFormatUtil
,PixelUtil
,BitmapUtil
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() | 여러번 초기화(세팅)할 때 |
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 |
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 |
format | 설명 |
---|---|
<MENU_NAME>.xml | option menu |
popup_<MENU_NAME>.xml | popup menu |
-
<WHAT><DESCRIPTION>
(CamelCase로 작성한다) - View의 대문자를 축약하여
<WHAT>
의 Prefix로 사용한다. - 아래 이름규칙을 적용한다.
- Android의 View는 CamelCase의 대문자를 축약한 형태로 정한다.
TextView -> tv
- 만약 View의 이름이 Space, Switch와 같이 1개의 대문자만 존재한다면 모두 소문자인 아이디로 정한다.
Switch -> switch
(만약 1개의 xml에 같은 여러 CustomView가 존재한다면 <WHAT>_<DESCRIPTION>
의 형태로 정한다.)
- 아래표에 해당 View의 Prefix가 정의되어 있지 않다면 팀에서 상의해서 이름을 정한뒤 추가한다.
WHAT
Prefix | View |
---|---|
tv | TextView |
iv | ImageView |
cb | CheckBox |
rv | RecyclerView |
et | EditText |
nsv | NestedScrollView |
switch | Switch |
btn | Button |
<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 |
- 여러 군데에서 재사용되는 개념이라면 변수로 정의해서
@dimen/xxx
와 같이 사용 - 그렇지 않다면 명시적으로
16dp
와 같이 작성
Margin/Padding
name format | 종류 |
---|---|
space_ | margin, padding |
특정 화면에서 위의 값을 따르지 않는경우 |
- 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 |
- 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 로 작성한다.