EditText로 값을 입력받고 버튼을 누르면

'저의 이름은 [이름]이고 [나이]살입니다!'라는 텍스트가 아래에 출력되도록 하였다.

 

1. MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    val liveUser = MutableLiveData<User>()

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

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.apply {
            activity = this@MainActivity
            lifecycleOwner = this@MainActivity  //지정해주지 않으면 liveData가 실시간으로 변경되지 않음
        }

        binding.btnOk.setOnClickListener {
            //버튼을 누르면 EditText에서 값을 받아와서 liveData의 값을 바꿔준다.
            liveUser.value = User(binding.etName.text.toString(), binding.etAge.text.toString().toInt())
        }
    }
}

 

2. User.kt

class User(val name: String, val age: Int) {

}

3. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<layout 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" >
    <data>
        <variable
            name="activity"
            type="com.monkey.databindingtest.MainActivity" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이름"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="@id/et_name"
            app:layout_constraintBottom_toBottomOf="@id/et_name"
            />
        <EditText
            android:id="@+id/et_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            app:layout_constraintLeft_toRightOf="@id/tv_name"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/tv_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="나이"
            app:layout_constraintLeft_toLeftOf="@id/tv_name"
            app:layout_constraintTop_toTopOf="@id/et_age"
            app:layout_constraintBottom_toBottomOf="@id/et_age"
            />
        <EditText
            android:id="@+id/et_age"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:digits="0123456789"
            android:inputType="number"
            app:layout_constraintLeft_toLeftOf="@id/et_name"
            app:layout_constraintRight_toRightOf="@id/et_name"
            app:layout_constraintTop_toBottomOf="@id/et_name"
            />
        <Button
            android:id="@+id/btn_ok"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="introduce"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_age"
            />

        <TextView
            android:id="@+id/tv_result"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#EAEAEA"
            android:text="@{`저의 이름은 ` + activity.liveUser.name + `이고 ` + activity.liveUser.age + `살 입니다!`}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/btn_ok"
            app:layout_constraintBottom_toBottomOf="parent"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

실행 화면

 

참고 사이트

 

View Binding과 Data Binding 예제

1. 들어가기에 앞서 2. 예제  2-1. 가장 기본적인 코드  2-2. View Binding  2-3. View Binding + ViewModel  2-4. View Binding + ViewModel + LiveData  2-5. Data Binding  2-6. Data Binding + ViewMode..

todaycode.tistory.com

 

LiveData(라이브 데이터)란?

1. LiveData란?  1-1. Observer  1-2. LiveData  1-3. LiveData의 장점 2. 사용법  2-1. gradle  2-2. LiveData 객체 생성  2-3. Observer 객체 생성 3. 예제 4. 더 알아보기  3-1. LifeCycleOwner  3-2...

todaycode.tistory.com

 

 

 

[DataBinding/LiveData] 안드로이드 DataBinding과 LiveData 같이 사용하기

안드로이드 DataBinding과 LiveData 같이 사용하기 - 기본  얼마전에 Android DataBinding의 사용과 LiveData의 사용을 알아봤습니다. 각각의 글에서 DataBinding은 LiveData와, LiveData는 DataBinding과 같이..

dev-imaec.tistory.com

 

I want to concat two strings for a TextView in android, Data Binding Api

Im using DataBinding Api for setting the views in android layouts. Here is my layout. layout.xml <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com...

stackoverflow.com

 

코틀린 문제.pdf
0.08MB

 

나중에 있을 스터디를 위해서 문제를 만들어 보았습니다.

 

답지는 아직 만들지 못했음..

 

혹시라도 보시는 분 중에 틀린 부분 발견하시면 있으면 말씀해주세요.

 


 

※ 네이버 부스트코스 - 코틀린 프로그래밍 기본1,2 편을 참고로 하여 만들었습니다.

강의 : 

https://www.boostcourse.org/mo132

https://www.boostcourse.org/mo234

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org

 

함수를 변수에 할당하는 다양한 방법

fun main() {
  val calcSum : Int = sum(3, 5)   //(1)
  val calcSubtract : Int = calculate(::subtract, 10, 5)   //(2)
  val calcMultiply : Int = calculate(fun (a:Int, b:Int) = a * b, 3, 5)    //(3)
  val calcDivide : Int = calculate({ a, b -> a / b }, 10, 5)  //(4)

  println("sum : $calcSum" +
      "\nsubtract : $calcSubtract" +
      "\nmultiply : $calcMultiply" +
      "\ndivide : $calcDivide"
  );
}

fun sum (a: Int, b: Int) = a + b
fun subtract (a: Int, b: Int) = a - b

fun calculate (calc: (Int, Int) -> Int, a: Int, b: Int) : Int{
	return calc(a, b)
}

(2) 미리 만들어놓은 일반 함수를 인자값으로 넘길 때는 :: 을 사용한다.

(3) 익명 함수로 넘길 수도 있다

(4) 람다식으로 넘길 수도 있다

참고 : https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29

 

코틀린 의 apply, with, let, also, run 은 언제 사용하는가?

원문 : “Kotlin Scoping Functions apply vs. with, let, also, and run”

medium.com

 


위 다섯개의 함수는 아래의 경우에서 각기 다른 특징을 가진다.

 

1. 호출 형태 (리시버를 어떻게 전달하는지?)

 A. 확장함수 형태

 B. 일반함수 형태

2. 코드 블록 내에서 리시버 객체를 어떻게 호출하는지?

 A. 파라미터로 전달하였기 때문에 it 키워드로 접근

 B. 리시버 객체로 전달하였기에 this 키워드로 접근

3. 반환값이 무엇인지?

 A. 전달 받은 리시버 객체

 B. 코드 블록의 수행 결과

 

  let run (확장함수) also apply with
호출 형태 A A A A B
코드 블록 내에서 리시버 객체에 접근하는 방법 A B A B B
반환값 A A B B A
언제 사용하는지? 리시버 객체가 null이 아닌 경우에 코드를 실행해야 하는 경우

Nullable 객체를 다른 Nullable 객체로 변환하는 경우

단일 지역 변수의 범위를 제한하는 경우(한 번 쓰고 말 변수 선언해서 사용하는 경우 방지)
어떤 값을 계산하거나

여러 개의 지역 변수의 범위를 제한하고자 할 때 (한번 쓰고 말 변수 선언해서 사용하는 경우 방지)
리시버 객체의 속성을 변경하지 않고 함수를 실행하고

리시버 객체를 다시 반환하려고 할 때
리시버 객체의 함수를 사용하지 않고 속성을 초기화한 뒤

리시버 객체를 다시 반환하려고 할 때
리시버 객체가 null이 아닌 경우에만 사용

결과가 필요하지 않을 때
사용 예시 다른 함수를 실행하거나 연산을 수행하는 경우 위 링크 참고 객체의 사이드이펙트 확인 시
객체의 초기화
레이아웃 초기화
null이 아닌 객체의 프로퍼티를 읽어서 처리하는 경우

리시버 객체를 전달하는 방식이 두 가지가 있는데 

let, also와 같이 내부에서 it으로 접근하는 방식은 

리시버 객체를 복사하여 전달하고

run, apply, with는 객체 본인을 그대로 전달한다는 차이가 있다.

5. with

- 일반 함수로 사용 (인자가 필요함)

- 인자로 받는 객체를 블록의 리시버로 전달

- 블록의 마지막 줄을 반환

 

<예제>

var person : Person = Person("david", "male", "game")

var p : Person = with(person) {
    println("with01")
    printInfo(this);
    hobby = "walk"
    Person("hannah", "female", "swim")
}

println("with02")
printInfo(p)

<결과>

with01    
printInfo :: 
    name -> david
    hobby -> game
    sex -> male
with02
//마지막 줄을 반환하였기 때문에 david가 아닌 hannah가 나옴
printInfo :: 
    name -> hannah
    hobby -> swim
    sex -> female

 

- 세이프 콜을 지원하지 않기 때문에 NPE에 주의하여야 함 (let과 함께 사용하여 문제를 해결할 수 있음)

person?.let {
    with(it) {
        ...
    }
}

그리고 이를 run()함수를 이용하여 사용할 수 있음

person?.run() {
    ...
}

 

+ Recent posts