View 바인딩
사용자의 입력 정보를 수신하거나 정보를 표시하기 위해서는 View에서 데이터를 받거나 전달 할 필요가 있습니다. 이를 하기 위해서는 크게 두가지 방법이 있습니다.
- View 바인딩 : Activity와 Fragment가 View의 참조를 가지고 있어 View를 직접 갱신 할 수 있도록 합니다.
- Data 바인딩 : 최근 javascript 많이 채용하는 기법으로 View에 데이터를 바인딩하고 Activity와 Fragment에서 데이터를 업데이트하는 등 두 역활을 분리해 줍니다.
이번에는 View 바인딩 기법을 사용 합니다. 먼저 해야할 일은 View에 고유한 id를 지정해 줍니다.
... ... android : id = "@ + id / refresh_layout" ... android : id = "@ + id / recycler_view" android : id = "@ + id / empty_text" ...
View 바인딩 또는 Data 바인딩인가
안드로이드가 제공하는 Data Binding 라이브러리를 사용하면 View에서 데이터를 바인딩하는 방법으로 구현이 가능합니다. 그러나 개인적인 의견으로, 아직 Data Binding 라이브러리의 이점(뷰 작업의 분리에 의한 코드 단순화)은 그 단점(자유도가 높고, 특히 팀 개발에 스파게티 코드를 발생시킴)을 완화 하기에는 시기상조라고 생각합니다.
다음은 Fragment 클래스에 View 변수를 준비하고 onCreateView () 메소드에서 View 대한 참조를 가져옵니다. 이 방법은 이전 Android 개발에 ButterKnife 라이브러리를 사용하는 것이 기본이 었습니다. 그러나 Android 8.0 으로 업데이트 된 시점 (= compileSdkVersion가 26 이상)에 돌입 한 지금이라면 Android의 표준 방법을 채택하는 것이 좋다고 생각합니다.
public class UserListFragment extends Fragment { private SwipeRefreshLayout mRefreshLayout ; private RecyclerView mRecyclerView ; private AppCompatTextView mEmptyText ; ... @Override public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
final View root = inflater . inflate ( R . layout . fragment_user_list , container , false ); mRefreshLayout = root . findViewById ( R . id . refresh_layout ); mRecyclerView = root . findViewById ( R . id . recycler_view ); mEmptyText = root . findViewById ( R . id . empty_text ); return root ; } ... }
Android 8.0에서는 View.findViewById () 메소드가 제네릭에 대응했습니다. 따라서 아래의 예와 같이 명시 적 캐스트는 더 이상 필요하지 않습니다.
mRefreshLayout = ( SwipeRefreshLayout ) root . findViewById ( R . id . refresh_layout );
ButterKnife를 사용하는 경우
compileSdkVersion이 업데이트 할 수없는 상황과 View 변수와 바인드 대상을 식별 id를 가까운 곳에 설명하려면 ButterKnife을 사용합시다.
조각의 클래스 View 변수를 제공하여 View의 id를 지정했다 @BindView 주석을 부여합니다.
public class UserListFragment extends Fragment { @BindView ( R . id . refresh_layout ) SwipeRefreshLayout mRefreshLayout ; @BindView ( R . id . recycler_view ) RecyclerView mRecyclerView ; @BindView ( R . id . empty_text ) AppCompatTextView mEmptyText ; ... }
또한 onCreateView () 메소드에서 View 바인딩 onDestroyView () 메소드로 그 해제합니다.
public class UserListFragment extends Fragment { private Unbinder mUnbinder ; ... @Override public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) { final View root = inflater . inflate ( R . layout . fragment_user_list , container , false ); // View 바인딩 mUnbinder = ButterKnife . bind ( this , root ); return root ; } @Override public void onDestroyView () { super . onDestroyView (); // View 바인딩 해제 mUnbinder . unbind (); } ... }
build.gradle을 아래와 같이 설정해야합니다. 또한 ButterKnife 버전 8.0.0 이상에서 라이브러리 자체에 ProGuard 설정이 포함되도록 되었기 때문에 ButterKnife의 ProGuard 설정은 필요하지 않습니다.
dependencies { compile 'com.jakewharton : butterknife : 8.8.1' annotationProcessor 'com.jakewharton : butterknife-compiler : 8.8.1' ... 생략 ... }
'IT 이모저모' 카테고리의 다른 글
Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 5 (0) | 2018.03.15 |
---|---|
Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 4 (0) | 2018.03.14 |
batch 명령어 Taskkill (프로세스 종료) (3) | 2018.03.13 |
Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 2 (0) | 2018.03.13 |
Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 1 (0) | 2018.03.13 |