2024. 3. 28. 09:06, ๐ฑAndroid TIL
๋ฐ์ํ
๐ฑ Today I Learned (์ง์ค์๊ฐ 6์๊ฐ 30๋ถ)
- (09:10 ~ 11:50 / 1์๊ฐ 40๋ถ) - ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ 2๋ฌธ์ ํ์ด
- (12:10 ~ 12:40 / 30๋ถ) ๊ฐ์ธ ๊ณผ์ ์ ์ถ ๋ฐ ์ด๋ฒ ๋ฐ์ ํ์ต๋ด์ฉ ๋ณต์ต
- (16:10 ~ 17:25 / 1์๊ฐ 15๋ถ) ์ด๋ฒ ๋ฐ์ ์ฌํ ๋จ๊ณ๊น์ง ๋ชจ๋ ๊ตฌํ (registerForActivityResult, Random)
- (19:30 ~ 20:30 / 1์๊ฐ) ์ด๋ฒ ๋ฐ์ ๊ฐ์ธ์ ์ธ ๊ตฌํ (Visible)
- (20:30 ~ 21:00 / 30๋ถ) ํ ๋ฐ์ผ๋ฆฌ ํ๊ณ
- (17:25 ~ 17:50, 21:00 ~ 21:30 / 55๋ถ) ๊นํ๋ธ ๋ฆฌ๋๋ฏธ ๋ฐ TIL ์์ฑ ๋ฐ ์ ๋ฆฌ
- (21:40 ~ 22:10 / 30๋ถ) ๋ถ์คํธ์ฝ์ค ๊ฐ์ข ๋ฑ (๊ฐ์ธ/๋ฒ์ธ)
*** ์ ์ฌ 13:00 ~ 14:00 / ์ ๋ 18:00 ~ 19:00 ์ ์ธ
โ
1. ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ 2๋ฌธ์ ํ์ด
- ์ฒ์์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด ์ด์์ ๋ํ ์๊ฐ์ ํด๋ณด์๋ค.
- toIntOrNull์ ์ด์ฉํด ๋ฌธ์์ด์ด ์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋์ง ์ฐพ๋ ๋ฐฉ์์ ์ ๋ฐํ๋ค.
๐กisDigit()
val char1 = '5'
val char2 = 'a'
println(char1.isDigit()) // true
println(char2.isDigit()) // false
- ๋ฌธ์๊ฐ ์ซ์์ธ์ง๋ฅผ ํ๋ณ
- ๋ฌธ์์ด์ ๊ฒฝ์ฐ ์ซ์๋ฅผ ํ๋๋ผ๋ ๊ฐ์ง๊ณ ์์ผ๋ฉด true์์ ์ฃผ์
- ์ฌ์ฉ๋ฒ: Char.isdigit()
๐กisLetter()
val char1 = 'A'
val char2 = '5'
println(char1.isLetter()) // true
println(char2.isLetter()) // false
- ๋ฌธ์๊ฐ ์ํ๋ฒณ ๋ฌธ์์ธ์ง๋ฅผ ํ๋ณ
- ๋ฌธ์์ด์ ๊ฒฝ์ฐ ์ซ์๋ฅผ ํ๋๋ผ๋ ๊ฐ์ง๊ณ ์์ผ๋ฉด true์์ ์ฃผ์
- ์ฌ์ฉ๋ฒ: Char.isLetter()
๐กall()
val numbers = listOf(1, 2, 3, 4, 5)
val allEven = numbers.all { it % 2 == 0 }
println(allEven) // false
val letters = listOf('a', 'b', 'c', 'd', 'e')
val allLowercase = letters.all { it.isLowerCase() }
println(allLowercase) // true
- ์ปฌ๋ ์ ์ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง๋ฅผ ํ์ธ
- ์ฌ์ฉ๋ฒ: Collection.all { predicate(๊ฐ ์์๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ํจ์, true or false) }
๐ก.toIntOrNull()
"123".toIntOrNull() -> ์ ์ 123์ ๋ฐํ
"abc".toIntOrNull() -> null์ ๋ฐํ
"ab3c".toIntOrNull() -> null์ ๋ฐํ
- ์ฃผ์ด์ง ๋ฌธ์์ด์ ์ ์๋ก ๋ณํํ ์ ์๋์ง๋ฅผ ํ์ธ
- ๋ณํํ ์ ์๋ค๋ฉด ๊ทธ ์ ์ ๊ฐ์ ๋ฐํํ๊ณ , ๋ณํํ ์ ์๋ค๋ฉด null์ ๋ฐํ
2. ์ด๋ฒ ๋ฐ์ ์ฌํ ๋จ๊ณ๊น์ง ๋ชจ๋ ๊ตฌํ ๋ฐ ๊ฐ์ธ์ ์ธ ๊ตฌํ
- ์ค๋์ ํด๋น ๊ณผ์ ๋ฅผ ์ฌํ์ํค๊ณ ๊ณต๋ถํ๋ ๋ฐ 2์๊ฐ 15๋ถ์ ์์ํ๋ค.
- 1) ํ์๊ฐ์ ์ ์ ๋ ฅ๋ ์์ด๋ ๋๊ธฐ๊ธฐ(registerForActivityResult ์ด์ฉ)
- 2) ๋๋ค ์ด๋ฏธ์ง ์ถ๋ ฅ(Random ์ด์ฉ)
- 3) ๋น๋ฐ๋ฒํธ ์ฒดํฌ๋ฐ์ค Visible ์ค์ (transformationMethod์ด์ฉ)
๐จ ํ์๊ฐ์ ์ ์ ๋ ฅ๋ ์์ด๋ ๋๊ธฐ๊ธฐ (registerForActivityResult)
class SignInActivity : AppCompatActivity() {
...
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
// ActivityResultLauncher์๋ฃํ์ธ resultLauncher ๋ณ์๋ฅผ ์ ์ญ ๋ณ์๋ก ์ ์ธ
override fun onCreate(savedInstanceState: Bundle?) {
...
// setResultNext ํจ์๋ฅผ ํธ์ถํ์ฌ resultLauncher ์ด๊ธฐํ
setResultNext()
...
signupButton.setOnClickListener {
val intent = Intent(this, SignupActivity::class.java)
resultLauncher.launch(intent)
}
}
...
private fun setResultNext(){
resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()){result ->
if(result.resultCode == RESULT_OK){
val id = result.data?.getStringExtra("id") ?: ""
val loginId = findViewById<EditText>(R.id.login_id)
loginId.setText(id)
// ์ค๋ฅ ํด๊ฒฐ: Edittext์ ๊ฒฝ์ฐ .text = ""๊ฐ ์๋๋ผ setText("") ์ด์ฉ
}
}
}
- ์ด์ ์๋ putExtra() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ธํ ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ๊ณ , startActivityForResult() ๋ฐ onActivityResult() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค๊ณ ํ๋๋ฐ ์ด startActivityForResult() ์ onActivityResult()๊ฐ deprecated ๋๋ค๊ณ ํ๋ค.
- ๋ฐ๋ผ์ ์ง๊ธ์ registerForActivityResult()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๊ณ ์๋ค.
- registerForActivityResult()
- ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํ ๋ฆฌ์ค๋(ActivityResultLauncher)๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํ๊ณ , ํด๋น ๋ฆฌ์ค๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ์ ์ ์
- ๋ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ด๋ฉฐ, onActivityResult() ๋ฉ์๋์์ ๋ฐ์ํ๋ ๋ฒ๊ฑฐ๋ก์ด ์์ ๋ค์ ๊ฐ์ํํจ
- ๋๋ค์์ ์ด์ฉํ์ฌ ์ฝ๋ฐฑ์ ์ฌ์ฉ, ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์ - ์ฐธ๊ณ ์ฌ์ดํธ (๋งํฌ)
- ๋ค์์ ์์ธํ ์ค๋ช ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ฐ๋ก ํฌ์คํ ํ ์๊ฐ์ด๋ค.
๐จ 2) ๋๋ค ์ด๋ฏธ์ง ์ถ๋ ฅ (Random)
val profilePic = findViewById<ImageView>(R.id.img_profile)
val img : IntArray = intArrayOf(R.drawable.pic1, R.drawable.pic2, R.drawable.pic3)
val random = Random()
val num = random.nextInt(img.size) // num ๋ณ์์ 0๋ถํฐ (images์ ๊ธธ์ด - 1) ๋งํผ ์ซ์ ์ค ๋ฌด์์ Int ์ ์ฅ
profilePic.setImageResource(img[num])
- ์ด๋ฏธ์ง๋ฅผ IntArray์ ๋ฃ๊ณ random์ ์ด์ฉํ๋ค.
- ์ฐธ๊ณ ์ฌ์ดํธ (๋งํฌ)
๐จ 3) ๋น๋ฐ๋ฒํธ ์ฒดํฌ๋ฐ์ค Visible ์ค์ (transformationMethod)
val loginPw = findViewById<EditText>(R.id.login_pw)
val visibleCheckBox = findViewById<CheckBox>(R.id.btn_visible)
visibleCheckBox.setOnCheckedChangeListener{ buttonView, isChecked ->
if (isChecked) {
// ์ฒดํฌ๋ ๊ฒฝ์ฐ, ์ผ๋ฐ ํ
์คํธ ์
๋ ฅ ํํ๋ก ๋ณ๊ฒฝ
loginPw.transformationMethod = null
} else {
// ์ฒดํฌ๊ฐ ํด์ ๋ ๊ฒฝ์ฐ, ๋น๋ฐ๋ฒํธ ์
๋ ฅ ํํ๋ก ๋ณ๊ฒฝ
loginPw.transformationMethod = PasswordTransformationMethod.getInstance()
}
}
- ์๋๋ xml ์์ฒด์์ ์จ๊ธฐ๊ธฐ/๋ณด์ด๊ธฐ ํ ๊ธ์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ด ์๋ค.
- <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"> ์์ ํ ์คํธ๋ทฐ ๋ฃ์ด์ฃผ๊ธฐ
</com.google.android.material.textfield.TextInputLayout> - ํ์ง๋ง ์์ ๊ฐ์ ๋ฐฉ์์ ์ปค์คํ ๋ ๋ถ๊ฐ๋ฅํ๊ณ , ์ฌ๋ฌ๋ชจ๋ก ์ ํ์ฌํญ์ด ๋ง์์ ์ง์ ์ฒดํฌ๋ฐ์ค๋ฅผ ๋ง๋ค๊ณ ์กํฐ๋นํฐ์ ๋ก์ง์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์์ ํ๋ค. ์ฒดํฌ๋ฐ์ค id๋ฅผ ๊ฐ์ ธ์์ setOnCheckedChangeListener๋ฅผ ๋ง๋ค๊ณ , ๊ธฐ์กด Edittext์ ์ ์ธ๋์ด ์๋ ํ์์ transformationMethod๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ญ Retrospect
๊ฐ์ธ ๊ณผ์ ๋ฅผ ์ ํ ์ฌํ ๋ด์ฉ๊น์ง ๊ตฌํํ๋ฉด์ ๋งค์ฐ ์ฌ๋ฏธ์์๋ค. ๋ค์ ์ฃผ ์ฒซ ํ์ ํ๋ก์ ํธ๋ ๊ธฐ๋๋๋ค!
โ
๋ฐ์ํ
๐ฌ C O M M E N T