Uing? Uing!!

[안드로이드 팁] 데이터바인딩 내부에서 리소스 또는 String(plain text)를 사용하는 방법 본문

Android

[안드로이드 팁] 데이터바인딩 내부에서 리소스 또는 String(plain text)를 사용하는 방법

Uing!! 2021. 10. 27. 03:17
반응형

데이터바인딩(databinding)

데이터바인딩을 활용하면 레이아웃에서 변수를 정의하고 활용할 수 있다.
데이터바인딩에 대한 포스팅은 별도로 작성 예정이지만, 간단히 데이터바인딩을 활용하는 예시는 이렇다.

<?xml version="1.0" encoding="utf-8"?> 
<layout> 
    <data> 
        <variable name="name" type="String" /> <!-- name 이라는 변수 정의 --> 
    </data> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:layout_width="match_parent" 
        android:layout_height="wrap_content"> 
        <TextView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_gravity="center" 
            android:text="@{name}"/> <!-- name 변수 활용 --> 
	</FrameLayout> 
</layout>
class MainActivity: AppCompatActivity() { 
    private var _binding: ActivityFirstBinding? = null
    private val binding: ActivityFirstBinding get() = _binding 
    
    override fun onCreate(savedInstanceState: Bundle?) { 
        super.onCreate(savedInstanceState) 
        _binding = DataBindingUtil.setContentView(this, R.layout.activity_main, null) 
        binding.name = "Sally" // databinding에 정의된 name에 값 설정 
    } 
}

 

데이터바인딩에서 변수와 함께 다른 값 사용

데이터바인딩 레이아웃에서 뷰 내부의 attribute에 "@{변수값}" 을 적용하면 해당 변수 값을 사용할 수 있다.
만일 변수값을 활용하지 않고 그냥 plain string만 사용하고 싶다면 @{}를 빼고 그냥 "Some String"과 같이 쓰면 된다.

하지만 데이터바인딩을 활용하다 보면, 변수값과 플레인 텍스트를 함께 사용하고 싶을 때가 있다.
이를테면 name이라는 변수가 null이 아니라면 name을, null이라면 'no name'이라는 값을 나타내고 싶은 경우가 있겠다.

이 경우 'no name'이라는 변수를 strings.xml에 리소스로 지정할 수도 있고, 아니면 레이아웃에서 직접 집어넣고자 할 수도 있다.

리소스 활용

만일 'no name'에 해당하는 값이 resources의 strings.xml에 지정되어 있는 값이라면 아래처럼 사용할 수 있다.

<TextView 
    android:id="@+id/edit_text_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:text="@{name != null ? name : @string/default_name}"
/>

 

String(Plain Text) 활용

스트링 값을 리소스에서 가져오지 않고 직접 레이아웃에 집어넣어야 하는 경우도 있다.
그러나 데이터바인딩의 "@{}" 내부에서는 텍스트를 "로 감쌀 수도 없고, '로 감쌀 수도 없다.
이럴 때에는 " 대신 `로 해당 스트링을 감싸면 된다.

<TextView 
    android:id="@+id/edit_text_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:text="@{name != null ? name : `no name`}"
/>
반응형
Comments