1. 뷰 바인딩
뷰바인딩
기능활성화
모듈 gradle 에 view bind true 설정
android {
...
buildFeatures {
viewBinding true
}
}
작명 규칙
activity_main.xml -> ActivityMainBinding
바인딩 클래스 파일
build/generated/data_binding_base_class_source_out 디렉토리에 생성
장점
Null 안정성
타입안정성
아이디 변경도 쉬움.. (refactory를 사용하면 한방에 kt, xml 파일 모두 수정 가능)
xml 파일 찾는 법
private lateinit var binding : ActivityMainBinding 에서
ActivityMainBinding 부분 컨트롤 + 클릭 하면 이동함..
임포트
중요한것은 아닌데 조금 헤맸었음
import com.example.myapplication.databinding.ActivityMainBinding
액티비티에서 사용
1. Inflate 메소드를 사용해서 사용할 바인딩 클래스의 인스턴스를 생성
2. setContentView() 에 최상위 뷰의 인스턴스를 넘겨줌
setContentView(bind.root)
3. 예제
class MainActivity : AppCompatActivity() {
// 액티비티에서 사용할 레이아웃의 뷰 바인딩 클래스
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 뷰 바인딩 클래스의 인스턴스를 생성합니다.
binding = ActivityMainBinding.inflate(layoutInflater)
// 생성된 뷰를 액티비티에 표시합니다.
setContentView(binding.root)
}
}
프래그먼트에서 사용
1. 액티비티와 비슷
2. onCreateView() 메서드의 반환 값으로 최상위뷰 인스턴스를 넘겨줍니다.
3. 예제
class SecondFragment : Fragment() {
private var _binding: FragmentSecondBinding? = null;
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentSecondBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
[전체소스]
[1. kt]
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater);
setContentView(binding.root)
binding.button.setOnClickListener{
var input1 : String = binding.input1.text.toString()
binding.output1.text = input1
}
}
}
[2.xml]
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<EditText
android:id="@+id/input1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="56dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="44dp"
android:text="적용"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/input1" />
<TextView
android:id="@+id/output_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="56dp"
android:text="이름 : "
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>
가변인자
fun suma(vararg inputs:Int):Int{
var output = 0
for(num in inputs){
output += num
}
return output
}
람다식
중괄호로 감싼다. { .. }
인자와 본문은 ->로 구분한다.
인자는 ()로 감싸지 않는다.
인자는 형식추론이 가능하므로 타입을 생략할 수 있다.
변수에 람다식을 담는경우에는 인자의 타입을 생략할 수 없다.
adb를 사용하여 버그 신고 캡처
$ adb bugreport E:\Reports\MyBugReports
'android training' 카테고리의 다른 글
ContextCompat (0) | 2021.05.18 |
---|---|
안드로이드 폴더경로 (1) | 2021.05.18 |
안드로이드스튜디오 단축키 (0) | 2016.03.14 |