본문 바로가기
언어 공부/Android

[Android/JAVA] 데이터 바인딩 Data Binding(1)

by 안다니. 2020. 9. 17.
반응형

MVVM 패턴으로 한번 만들어 보자라는 마음으로 시작했습니다.

 

Data Binding을 하기 위해선 먼저

Build.Gradle에서 dataBinding을 추가해줍니다.(App)

 dataBinding{
        enabled = true
    }

 

 

activity_login.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">
    
    <data>
        <variable
            name="viewModel"
            type="com.example.makeaviewmodel.login.viewModel.LoginViewModel" />
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="@color/colorPrimary">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginHorizontal="10dp"
            android:layout_gravity="center_vertical">

            <EditText
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:inputType="text"
                android:hint="@string/id"
                android:privateImeOptions="defaultInputmode=english"
                android:text="@={viewModel.userId}"
                app:OnFocusChangeListener="@{viewModel::onFocusChangeId}"/>
        </FrameLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginHorizontal="10dp"
            android:layout_gravity="center_vertical"
            android:layout_marginTop="40dp">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:inputType="textPassword"
                android:hint="@string/pw"
                android:privateImeOptions="defaultInputmode=english"
                android:text="@={viewModel.password}"
                setOnEditorActionListener="@{viewModel.editorActionListener}"/>

        </FrameLayout>


    </LinearLayout>

</layout>

여기서 보면,

hint는 res/value/strings.xml에 등록 시킨 이름을 넣어줬습니다

text로 값을 가지고 오는 부분은, "@={}"로 바인딩을 처리합니다.

 

<data>
	<variable
		name="viewModel"
		type="com.example.makeaviewmodel.login.viewModel.LoginViewModel" />
</data>

먼저 viewModel이라는 이름으로 작성해주고 

type은 선언한 객체들을 사용하기 위함이었습니다. 그렇다면 LoginViewModel에는 먼저 선언을 해준 객체들이 존재합니다.

 

LoginViewModel.java

public MutableLiveData<String> userId;
public MutableLiveData<String> password;

 

LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    private ActivityLoginBinding binding;
    private LoginViewModel loginViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
        binding.setLifecycleOwner(this); //이 객체가 이 액티비티의 라이프사이클을 참조하면서 데이터가 변경되거나 하면 refresh 시키겠다

        loginViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(LoginViewModel.class);
        binding.setViewModel(loginViewModel);
    }
}

 

데이터 바인딩은 이런 식으로 진행하면 될 것 같다.

반응형

댓글