IT 이모저모

Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 3

exien 2018. 3. 14. 10:36

View 바인딩


사용자의 입력 정보를 수신하거나 정보를 표시하기 위해서는 View에서 데이터를 받거나 전달 할 필요가 있습니다. 이를 하기 위해서는 크게 두가지 방법이 있습니다.


 - View 바인딩 : Activity와 Fragment가 View의 참조를 가지고 있어 View를 직접 갱신 할 수 있도록 합니다.

 - Data 바인딩 : 최근 javascript 많이 채용하는 기법으로 View에 데이터를 바인딩하고 Activity와 Fragment에서 데이터를 업데이트하는 등 두 역활을                         분리해 줍니다.


이번에는 View 바인딩 기법을 사용 합니다. 먼저 해야할 일은 View에 고유한 id를 지정해 줍니다.


<FrameLayout ... >
    
    <android.support.v4.widget.SwipeRefreshLayout
        ...
        android : id = "@ + id / refresh_layout" >
        
        <android.support.v7.widget.RecyclerView
            ...
            android : id = "@ + id / recycler_view" /> 
    
    </android.support.v4.widget.SwipeRefreshLayout>
    
    <android.support.v7.widget.AppCompatTextView android : id = "@ + id / empty_text" 
        ... />
        
    
</ FrameLayout>


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'
    
    ... 생략 ... }