[Android] Kotlin - TextInputLayout 정보 입력 및 출력 / Swithch 버튼 / CheckBox / Visibility 응용 문제 / 디자인 수정

2024. 1. 23. 10:34·대외활동

결과

 

 

 

 


 

과정

 

1. 아이디, 비밀번호, 이름을 입력한다.

2. 취미의 Switch버튼을 눌러 on이 되면 CheckBox가 보인다.

3. 좋아하는 취미를 선택한다.

4. 확인 버튼을 누르면 입력한 정보가 출력된다.

5. 취미를 선택하지 않은 경우 취미가 없다라고 뜬다.

 

 

 


 

처음 코드

 

MainActivity.kt

package kr.co.lion.ex07

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.CheckBox
import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.google.android.material.textfield.TextInputLayout
import kr.co.lion.ex07.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)

// 화면에 출력하는 함수 호출
viewInfo()
}
// 화면에 출력할 정보(아이디, 비밀번호, 입력) 입력하고 저장하는 기능
fun viewInfo(){
activityMainBinding.apply {
// 스위치 버튼이 on이면 CheckBox가 보이게 설정
switchHobby.setOnCheckedChangeListener { compoundButton, ischecked ->
when(ischecked){
// 스위치 on
true -> {checkBoxSoccer.isVisible = true
checkBoxBasket.isVisible = true
checkBoxBaseball.isVisible = true}
// 스위치 off
false -> {checkBoxSoccer.isVisible = false
checkBoxBasket.isVisible =false
checkBoxBaseball.isVisible = false}
}
}
// 확인 버튼을 클릭했을 때
buttonCheck.setOnClickListener {
var id = textId.text.toString()
var password = textPassword.text.toString()
var name = textName.text.toString()

// 입력하지 않은 칸이 있을 경우 예외처리
emptyExcep()
//결과 출력
textView.text = "아이디: ${id}\n비밀번호: ${password}\n 이름: ${name}\n"
viewHobbyText()
}
}
}

// 취미의 결과를 텍스트에 삽입하는 기능
fun viewHobbyText(){
activityMainBinding.apply {
if(switchHobby.isChecked){
// 축구, 농구, 야구를 선택했는지 if문은 작성하지 않아도 됨
// if문은 위에서 true가 나오면 밑의 if문을 보지 않기 때문이다.
// 축구, 농구, 야구를 조건 없이 모두 확인해야 함
val soccerChecked = getCheckedString(checkBoxSoccer.isChecked, checkBoxSoccer)
textView.append(soccerChecked)

val basketChecked = getCheckedString(checkBoxBasket.isChecked, checkBoxBasket)
textView.append(basketChecked)

val baseballChecked = getCheckedString(checkBoxBaseball.isChecked, checkBoxBaseball)
textView.append(baseballChecked)
if((!checkBoxSoccer.isChecked && !checkBoxBasket.isChecked && !checkBoxBaseball.isChecked)){
textView.append("취미가 없습니다.")
}
}
}
}

// 각각의 취미를 선택했는지 테스트하는 기능
fun getCheckedString(checked:Boolean, checkBox: CheckBox) = when(checked){
// checkBox를 매개변수로 두어 각각의 취미로 테스트 가능
true -> "취미로 ${checkBox.text}을 합니다.\n"
false -> ""
}

// 입력 칸이 비었는지 확인하는 기능
fun checkedInputIsEmpty(empty:Boolean, textInput:TextInputLayout){
if(empty){textInput.isErrorEnabled = true
textInput.error = "입력 오류가 발생하였습니다"}
}

//입력되지 않았을 때 예외 처리 기능
fun emptyExcep(){
activityMainBinding.apply {
checkedInputIsEmpty(textId.text.toString().isEmpty(), textInputId)
checkedInputIsEmpty(textPassword.text.toString().isEmpty(), textInputPassword)
checkedInputIsEmpty(textName.text.toString().isEmpty(), textInputName)
}
}
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#272727"
android:orientation="vertical"
tools:context=".MainActivity">

<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#000000"
android:text="INFO"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textColor="#FFFFFF" />

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="아이디 입력"
android:textAlignment="textStart"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="비밀번호 입력"
android:inputType="text|textPassword"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="이름"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHobby"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:fontFamily="monospace"
android:paddingLeft="12dp"
android:text="취미"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="#DADADA" />

<CheckBox
android:id="@+id/checkBoxSoccer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="축구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<CheckBox
android:id="@+id/checkBoxBasket"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="농구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<CheckBox
android:id="@+id/checkBoxBaseball"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="야구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<Button
android:id="@+id/buttonCheck"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:background="#2C2C2C"
android:text="확인"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/white" />

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#E3E3E3"
android:text="결과"
android:textAlignment="center"
android:textColor="#2C2C2C"
tools:textAppearance="@style/TextAppearance.AppCompat.Large" />

</LinearLayout>

 

 

 

 

 


 

보완한 점

 

1. 레이아웃 설정 습관화하기

만들다보니 나도 모르게 레이아웃 없이 요소들을 나열함

->

구조화되어 있지 않으면 유지 보수에 부적합!

 

2. endIconMode

clear_text, password_toggle과 같은 기능 활용!

 

3. 스크롤뷰 설정

스크롤뷰를 통해 화면이 잘려도 내려갈 수 있게 함

 

4. 예외처리 시 when의 필요성

입력 오류를 해결해도

입력 오류 안내 문구가 사라지지 않는 문제

 

->

if를 사용해서 empty == true만 설정함

if 사용 시 if만 쓰는게 아닌 이상 모두 동작하지 않음(if, else중 하나만)

 

|

 

when을 사용하는 코드로 변경!

 

 

 

 

 


 

 

 

디자인에서 알게 된 점

 

- textInputLayout

textInputLayout: 힌트 색상, endIconMode와 icon 색상 변경 가능

textInputEditText: text색상 변경 가능

 

- 버튼 배경색 변경 불가 문제

밑의 themes.xml에서

parent="Theme.Material3.DayNight.NoActionBar"

코드로 인해 Material 설정이 되어 있어서 변경 불가

-> 이를 다르게 변경하면 수정 가능하나 해보니 다른 부분에 에러가 떠서 변경하지 않음

 

 

 

 


 

 

보완한 코드

 

MainActivity.kt

package kr.co.lion.ex07

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.CheckBox
import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.google.android.material.textfield.TextInputLayout
import kr.co.lion.ex07.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)

// 화면에 출력하는 함수 호출
viewInfo()
}
// 화면에 출력할 정보(아이디, 비밀번호, 입력) 입력하고 저장하는 기능
fun viewInfo(){
activityMainBinding.apply {
// 스위치 버튼이 on이면 CheckBox가 보이게 설정
switchHobby.setOnCheckedChangeListener { compoundButton, ischecked ->
when(ischecked){
// 스위치 on
true -> {checkBoxSoccer.isVisible = true
checkBoxBasket.isVisible = true
checkBoxBaseball.isVisible = true}
// 스위치 off
false -> {checkBoxSoccer.isVisible = false
checkBoxBasket.isVisible =false
checkBoxBaseball.isVisible = false}
}
}
// 확인 버튼을 클릭했을 때
buttonCheck.setOnClickListener {
var id = textId.text.toString()
var password = textPassword.text.toString()
var name = textName.text.toString()

// 입력하지 않은 칸이 있을 경우 예외 처리
emptyExcep()
//결과 출력
textView.text = "아이디: ${id}\n비밀번호: ${password}\n 이름: ${name}\n"
viewHobbyText()
}
}
}

// 취미의 결과를 텍스트에 삽입하는 기능
fun viewHobbyText(){
activityMainBinding.apply {
if(switchHobby.isChecked){
// 축구, 농구, 야구를 선택했는지 if문은 작성하지 않아도 됨
// if문은 위에서 true가 나오면 밑의 if문을 보지 않기 때문이다.
// 축구, 농구, 야구를 조건 없이 모두 확인해야 함
val soccerChecked = getCheckedString(checkBoxSoccer.isChecked, checkBoxSoccer)
textView.append(soccerChecked)

val basketChecked = getCheckedString(checkBoxBasket.isChecked, checkBoxBasket)
textView.append(basketChecked)

val baseballChecked = getCheckedString(checkBoxBaseball.isChecked, checkBoxBaseball)
textView.append(baseballChecked)
if((!checkBoxSoccer.isChecked && !checkBoxBasket.isChecked && !checkBoxBaseball.isChecked)){
textView.append("취미가 없습니다.")
}
}
}
}

// 각각의 취미를 선택했는지 테스트하는 기능
fun getCheckedString(checked:Boolean, checkBox: CheckBox) = when(checked){
// checkBox를 매개변수로 두어 각각의 취미로 테스트 가능
true -> "취미로 ${checkBox.text}을 합니다.\n"
false -> ""
}

// 입력 칸이 비었는지 확인하는 기능
fun checkedInputIsEmpty(empty:Boolean, textInput:TextInputLayout){
when(empty){
true -> {textInput.isErrorEnabled = true
textInput.error = "입력 오류가 발생하였습니다"}
false -> textInput.isErrorEnabled = false
}
}

//입력하지 않았을 때 예외 처리 기능
fun emptyExcep(){
activityMainBinding.apply {
checkedInputIsEmpty(textId.text.toString().isEmpty(), textInputId)
checkedInputIsEmpty(textPassword.text.toString().isEmpty(), textInputPassword)
checkedInputIsEmpty(textName.text.toString().isEmpty(), textInputName)
}
}
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#272727"
android:orientation="vertical"
tools:context=".MainActivity">

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#000000"
android:text="INFO"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textColor="#FFFFFF" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9"
app:endIconMode="clear_text">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="아이디 입력"
android:textAlignment="textStart"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9"
app:endIconMode="password_toggle"
app:endIconTint="#FFFFFF">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="비밀번호 입력"
android:inputType="text|textPassword"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#D1CFC9"
app:endIconMode="clear_text">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:hint="이름"
android:textColor="#FFFFFF"
android:textStyle="bold"
tools:textColorHint="#DCDCDC" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHobby"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:fontFamily="monospace"
android:paddingLeft="12dp"
android:text="취미"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="#DADADA" />

<CheckBox
android:id="@+id/checkBoxSoccer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="축구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<CheckBox
android:id="@+id/checkBoxBasket"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="농구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<CheckBox
android:id="@+id/checkBoxBaseball"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="야구"
android:textColor="#FFFFFF"
android:visibility="gone" />

<Button
android:id="@+id/buttonCheck"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:background="#2C2C2C"
android:text="확인"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/white" />

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#E3E3E3"
android:text="결과"
android:textAlignment="center"
android:textColor="#2C2C2C"
tools:textAppearance="@style/TextAppearance.AppCompat.Large" />
</LinearLayout>

</LinearLayout>
</ScrollView>

</LinearLayout>

 

 

 

 

 

 


 

보완한 결과

 

 

 

출처: 멋쟁이사자처럼 앱스쿨 2기에서 공부 중~!

저작자표시 (새창열림)

'대외활동' 카테고리의 다른 글

[아이티센 AIE 부트캠프 1기] ITCEN 타워 탐방 Career Day  (1) 2026.07.03
[아이티센 AIE 부트캠프 1기] 첫 교육을 시작하며 마음가짐  (0) 2026.03.16
[Pure App] Bottomnavigationbar 적용 / Provider 이용 (with Flutter)  (0) 2024.05.05
[Android] Kotlin - 사칙연산 계산기 만들기 / 예외 처리 / 함수 구조화  (2) 2024.01.22
'대외활동' 카테고리의 다른 글
  • [아이티센 AIE 부트캠프 1기] ITCEN 타워 탐방 Career Day
  • [아이티센 AIE 부트캠프 1기] 첫 교육을 시작하며 마음가짐
  • [Pure App] Bottomnavigationbar 적용 / Provider 이용 (with Flutter)
  • [Android] Kotlin - 사칙연산 계산기 만들기 / 예외 처리 / 함수 구조화
미우딩
미우딩
다양한 프로그래밍 언어를 공부하고 있는 공대생입니다! Python, Java, C언어를 주로 공부하고 있으며 Figma를 통한 디자인도 종종 올릴 예정입니다.
  • 미우딩
    미우의 코딩 기록
    미우딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • Java (47)
      • C언어 (0)
      • 대외활동 (5)
      • Spring (4)
      • 프로젝트 (2)
      • 앱개발 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    IT #알고리즘 #코딩테스트 #삽입정렬 #오름차순정렬
    IT #백준 #코딩테스트 #알고리즘 #구간합 #반복문
    IT #알고리즘 #코딩테스트 #우선순위큐 #힙 #절댓값 #오름차순 #정렬
    IT #코딩테스트 #알고리즘 #투포인터 #시간제한 #Scanner #BufferedReader #StringTokenizer
    IT #코딩테스트 #알고리즘 #백준 #투포인터 #배열
    IT #코딩테스트 #이진탐색 #알고리즘
    IT #코딩테스트 #알고리즘 #스택 #
    IT #알고리즘 #코딩테스트 #DFS
    IT #코딩테스트 #알고리즘 #슬라이딩윈도우 #투포인터 #함수
    java #android #개발자
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #아스키코드
    BufferedReader
    android #java #kotlin #compose
    IT #코딩테스트 #알고리즘 #DFS #재귀함수 #무방향그래프
    IT #알고리즘 #코딩테스트 #퀵정렬 #오름차순정렬
    IT #BFS #코딩테스트 #구현 #큐 #재귀함수
    IT #알고리즘 #그리디알고리즘 #탐욕알고리즘 #코테
    android #java #kotlin #상태관리
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #평균구하기
    IT #코딩테스트 #알고리즘 #버블정렬 #오름차순
    Spring #정적컨텐츠 #MVC #템플릿엔진 #API #애너테이션
    IT #알고리즘 #코딩테스트 #선택정렬 #내림차순정렬 #최댓값
    push #pop #StringBuffer
    IT #큐 #알고리즘 #코딩테스트 #자바 #선입선출
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
미우딩
[Android] Kotlin - TextInputLayout 정보 입력 및 출력 / Swithch 버튼 / CheckBox / Visibility 응용 문제 / 디자인 수정
상단으로

티스토리툴바