본문 바로가기
Android

[Android] Java 에서 Kotlin 으로 넘어가기 1. findViewById

by bryan.oh 2022. 2. 23.
반응형
Android 를 Java 로만 개발했었는데, Kotlin 으로 갈아타기 위해
이것저것 테스트 해보며 필요한것만 남기려고 포스팅합니다.
따라하기가 아닌, 한번 쓱~ 훑어보듯이 보면 좋을듯 합니다.

 

요약

Java TextView textView = findViewById(R.id.main_test_button);
Kotrlin 1) val textView: TextView = findViewById(R.id.main_test_button)
2) val textView = findViewById<TextView>(R.id.main_test_button)
3) ViewBinding 사용 ★

 

컴포넌트 가져오기

    <TextView
        android:id="@+id/main_test_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

이렇게 있다면, 

val testTv = findViewById<TextView>(R.id.main_test_textview);

이렇게 하거나 또는,

val testTv: TextView = findViewById(R.id.main_test_textview);

둘다 가능합니다.

java 와 많이 차이나지 않네요.

TextView textView = 으로 하는것 말고는..

 

그런데! extension 이라는게 있네요!

build.gradle 에 plugins 에 추가해야할 것이 있습니다.

그리고 아까 activity_main.xml 에서 textview 의 id 를 그대로 소스에서 씁니다.

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_main)
    
	main_test_textview.setText("Hello~ Bryan!");
}

전역으로 쓸수 있습니다.

 

 

앗, 이건 deprecated 될 예정이라고 하는데요,

관련 내용 링크

ViewBinding 을 사용해야 겠네요.

build.gradle (module) 에 viewBinding true 있는지 확인. (기본으로 들어가있네요,)

android {
    compileSdk 31

	// 생략..

    buildFeatures {
        viewBinding true
    }
}

Activity ViewBinding

ActivityMain.kt 에서 class 변수로

private lateinit var binding: ActivityMainBinding

그리고 onCreate 에서

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    
    // activity_main.xml 에서 TextView 의 id 가 android:id="@+id/main_title_textview"
    // snake case 를 camel case 로 바꾸면 됩니다. 
    // main_title_textview -> mainTitleTextView
    binding.mainTitleTextView.text = "Hello~ Bryan~";

    // 생략..
}

 

Fragment ViewBinding

    private var _binding: FragmentLightBinding? = null
    private val binding get() = _binding!!

layout file name 이 fragment_light.xml 이면 _binding에 FragmentLight + Binding 으로 쓰면 됩니다.
fragment_light -> FragmentLightBinding

// 주입
_binding = FragmentLightBinding.inflate(inflater, container, false)

destroy 

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

 

전체 소스

import com.bryan.selfdentlight.databinding.FragmentLightBinding

class LightFragment : Fragment() {

    private var _binding: FragmentLightBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentLightBinding.inflate(inflater, container, false)
        val view = binding.root
        binding.lightFragFinishButton.setOnClickListener{
            activity?.supportFragmentManager?.beginTransaction()?.remove(this)?.commit()
        }
        return view
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

 

 

[참고] kotlin 코드로 이것저것 테스트 해볼 수 있는, 플레이그라운드 링크

728x90
반응형

댓글