MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView nameView, phoneView, addressView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameView = findViewById(R.id.name);
phoneView = findViewById(R.id.phone);
addressView = findViewById(R.id.address);
fetchUserProfile();
}
private void fetchUserProfile() {
UserProfile userProfile = new UserProfile();
userProfile.name = "홍길동";
userProfile.phone = "010-0000-0000";
userProfile.address = "서울시 강남구 대치동";
updateUI(userProfile);
}
private void updateUI(UserProfile userProfile) {
nameView.setText(userProfile.name);
phoneView.setText(userProfile.phone);
addressView.setText(userProfile.address);
}
}
UserProfile.java
public class UserProfile {
public String name;
public String phone;
public String address;
}
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:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
데이터를 화면에 표시하는 일반적인 절차
안드로이드 3.6버전 이상부터 사용할 수 있다.
build.gradle (module)
android {
…
viewBinding {
enabled true
}
}
위 줄을 추가하고 Sync Now까지 완료하면 안드로이드 스튜디오가 클래스를 자동으로 만들어준다.
private TextView nameView, phoneView, addressView
nameView = findViewById(R.id.name);
phoneView = findViewById(R.id.phone);
addressView = findViewById(R.id.address);
이제 그럼 클래스를 사용해보자.
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
위의 코드 한 줄만으로 activity_main.xml 레이아웃 파일을 인플레이션해서 이 레이아웃의 id가 정의되어 있는 뷰들을 레퍼런스로 만들고 레퍼런스에 실체 객체를 매칭해주는 일이 수행된다.
// ViewBinding 사용 전
setContentView(R.layout.activity_main);
// ViewBinding 사용 후
setContentView(binding.getRoot());
binding 객체에는 인플레이션된 객체의 최상위 객체를 가져오는 getRoot 메서드가 존재한다. 따라서 setContentView에도 리소스아이디를 전달하는 대신에 이미 생성이 된 루트뷰를 전달해줄 수 있다.
// ViewBinding 사용 전
private void updateUI(UserProfile userProfile) {
nameView.setText(userProfile.name);
phoneView.setText(userProfile.phone);
addressView.setText(userProfile.address);
}
// ViewBinding 사용 후
private void updateUI(UserProfile useProfile) {
binding.name.setText(userProfile.name);
binding.phone.setText(userProfile.phone);
binding.address.setText(userProfile.address);
}
updateUI도 역시 이렇게 바꿔줄 수 있다.
ViewBinding을 활용한 MainActivity.java의 전체 코드
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMinBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
fetchUserProfile();
}
private void fetchUserProfile() {
UserProfile userProfile = new UserProfile();
userProfile.name = "홍길동";
userProfile.phone = "010-0000-0000";
userProfile.address = "서울시 강남구 대치동";
updateUI(userProfile);
}
private void updateUI(UserProfile useProfile) {
binding.name.setText(userProfile.name);
binding.phone.setText(userProfile.phone);
binding.address.setText(userProfile.address);
}
}
뷰바인딩을 위한 코드가 메인액티비티 소스코드에서 사라졌기 때문에 소스코드가 보다 간결해진 모습이다. 다음 포스팅 내용인 데이터바인딩까지 활용해 updateUI 코드도 단축하면 메인액티비티에서는 실제 중요한 로직인 fetchUserProfile에 집중할 수 있게 된다.
build.gradle (modlue)
android {
…
buildFeatures {
viewBinding true
}
}
위 줄을 추가하고 Sync Now까지 완료하면 안드로이드 스튜디오가 클래스를 자동으로 만들어준다.
MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater);
setContentView(binding.root)
binding.textView.text = "안녕하세요.";
}
}
뷰바인딩 변수 binding은 onCreate에서 초기화를 하기 위해 lateinit로 지정한다. Java에서 root객체에 getRoot 메서드로 접근했던 것과 달리, Kotlin에서는 바로 root에 접근한다.