개발자
로그인 기능에서 아이디와 비밀번호 EditText에서 값을 입력받고, 두 EditText 모두 값이 입력이 되면 버튼의 Background를 변경하고 싶어 코드를 이렇게 작성하였습니다. 그러나 setBackgroundResource가 작동되지 않는 것인지, 버튼의 색상이 변경되지 않습니다. 제가 작성한 코드가 제가 구현하고 싶은 것과 맞는 코드인지, background가 변경되지 않는 현상을 고치는 방법은 없을지 궁금합니다
1class LoginActivity : AppCompatActivity() {
2 private lateinit var binding: ActivityLoginBinding
3 private var id = ""
4 private var pw = ""
5 override fun onCreate(savedInstanceState: Bundle?) {
6 super.onCreate(savedInstanceState)
7 binding = ActivityLoginBinding.inflate(layoutInflater)
8 setContentView(binding.root)
9
10 binding.editLoginId.addTextChangedListener(textWatcher)
11 binding.editLoginPw.addTextChangedListener(textWatcher)
12
13 binding.btnLogin.setOnClickListener {
14 if (binding.btnLogin.isEnabled)
15 login()
16 }
17 updateButtonState()
18 }
19
20 private val textWatcher = object : TextWatcher {
21 override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
22 override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
23
24 override fun afterTextChanged(s: Editable?) {
25 id = binding.editLoginId.text.toString()
26 pw = binding.editLoginPw.text.toString()
27 updateButtonState()
28 }
29 }
30
31 private fun updateButtonState() {
32 Log.d("button", "버튼 상태 업로드 중")
33 val isEnabled = id.isNotEmpty() && pw.isNotEmpty()
34 binding.btnLogin.isEnabled = isEnabled
35
36 val backgroundResource = if (isEnabled) R.drawable.btn_after else R.drawable.btn_before
37 binding.btnLogin.setBackgroundResource(backgroundResource)
38 Log.d("button", "backgroundResource : $backgroundResource")
39 }
40
41 private fun login() {
42 val apiProvider = ApiProvider.getInstance().create(ServerApi::class.java)
43 apiProvider.login(LoginRequest(id, pw)).enqueue(object : Callback<LoginResponse> {
44 override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
45 if (response.isSuccessful) {
46 val responseBody = response.body()
47 if (responseBody != null) {
48 Token().setAccessToken(responseBody.accessToken)
49 Token().setPart(responseBody.part)
50 }
51
52 val intent = Intent(this@LoginActivity, MainActivity::class.java)
53 startActivity(intent)
54 finish()
55 } else {
56 Log.d("server", response.code().toString())
57 Toast.makeText(this@LoginActivity, "아이디나 비밀번호를 확인해주세요", Toast.LENGTH_SHORT).show()
58 }
59 }
60 override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
61 Log.d("server", t.message.toString())
62 Toast.makeText(this@LoginActivity, "서버 연동 실패", Toast.LENGTH_SHORT).show()
63 }
64 })
65 }
66}
답변 1
인기 답변
대충 코드만 보고 쓰는거에, 너무 오랜만에 AndroidView를 봐서 틀린 내용이 있을 수 있지만 참고해주세요 ㅎㅎ.. 만약에 Log.d("button", "backgroundResource : $backgroundResource") 이 로그가 제대로 출력되고 있다면, updateButtonState에서 isEnabled가 false인 상황에 button에 BackgroundResource를 설정하셨는데, Disabled된 Button의 BackgroundResource를 변경하고 있으신게 아닌지 확인해보시면 좋을것같아요. 여기에는 R.drawable.btn_after와 R.drawable.btn_before의 정보가 없어서 이부분에 대해서 정확한 리뷰는 어렵겠습니다.. https://stackoverflow.com/questions/35810614/how-do-i-set-the-disabled-color-of-a-button-with-appcompat 그리고 덤으로, textWatcher의 경우 안쓰는 before, onText state는 저렇게 안남겨놔도 되는 방법이 있었던 것 같은데 한번 검색해보시면 좋을 것 같아요! 어댑터패턴이었나..
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 02월 27일
사용하신 코드를 보았을 때, `setEnabled()`와 `setBackgroundResource()`는 올바르게 사용하셨습니다. 그러나 문제가 발생한다면 다음 사항들을 체크해보시는 것이 좋겠습니다. 1. `R.drawable.btn_after`와 `R.drawable.btn_before` 파일들이 정상적으로 drawable 디렉토리에 존재하는지 확인해보세요. 2. 해당 이미지 리소스들이 완전한 상태인지 확인하세요. 예를 들어 이미지 파일이 손상되었거나 형식에 맞지 않는 경우도 있습니다. 3. 이벤트가 발생하지 않아서 버튼의 배경색이 변하지 않는다면, Logcat에서 "버튼 상태 업로드 중" 및 "backgroundResource : $backgroundResource" 메시지가 표시되는지 확인해보세요. 4. Material Design의 버튼 스타일을 사용하실 경우, `setBackgroundResource()` 대신에 `setSupportBackgroundTintList()`를 이용하여 변경할 수 있음을 참고하세요. 그럼에도 불구하고 여전히 문제가 해결되지 않으면, 저희에게 추가 정보(오류 메시지, IDE 버전 등)를 제공해주시기 바랍니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!