ViewBinding-포함 된 레이아웃에 바인딩하는 방법은 무엇입니까?


11

ViewBinding으로 작업하는 동안 문서화되지 않은 사례가 거의 없습니다.

첫째 : 포함 된 일반 뷰 레이아웃 부분에 바인딩하는 방법, 기본 바인딩은 기본 레이아웃의 항목 만 볼 수 있습니까?

둘째 : 포함 된 병합 유형 레이아웃 부분에 대한 바인딩을 얻는 방법, 다시 기본 바인딩은 기본 레이아웃의 항목 만 보입니까?

답변:


14

다음의 경우 :

  1. 일반 레이아웃에 포함 (병합 노드 아님), 포함 된 부분에 ID를 할당해야합니다. 이렇게하면 바인딩에 포함 된 하위 부분에 액세스 할 수 있습니다
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

활동 코드에서 이런 식으로 :

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. 외부 레이아웃에 병합 블록을 포함시킵니다. 병합 블록이보기가 아니기 때문에 ID를 추가 할 수 없습니다. 영원한 병합 레이아웃 (merge_layout.xm)이 있다고 가정 해 봅시다.
<?xml version="1.0" encoding="utf-8"?>
<merge 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"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

이러한 병합 레이아웃을 올바르게 바인딩하려면 다음을 수행해야합니다.

활동 코드에서 :

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

1
이것은 버그 인 것 같습니다. 그냥 작동 해야 합니다 .
미겔

7

ViewBinding을 사용하여 포함 된 레이아웃으로 작업하는 첫 번째 질문은 쉽게 해결할 수 있습니다.

다음은 샘플 main_fragment.xml 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</LinearLayout>

그리고 MainFragment.java는 다음과 같이 할 수있다

public class MeaningFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

이제 두 개의 바인딩이 있습니다. 그중 하나는 기본값이고 다음은 포함 된 레이아웃입니다.


1
매우 간단한 대답이며 새로운 구문을 사용합니다 onCreate().의 구문이 비슷한 비 Fragment Activity에서 모두 작동합니다 . 감사. (를 사용하는 데 약간의 문제가 있음 DrawerLayout)
Fat Monk

0

다른 간단한 방법은 데이터 바인딩 라이브러리를 사용하는 것입니다. 그런 다음 라이브러리를 사용하는 경우 레이아웃의보기를 데이터 오브젝트와 바인딩하는 데 필요한 클래스를 자동으로 생성하도록 XML 레이아웃을 태그로 랩하십시오. 솔직히, 나는 그것이 갈 길이라고 생각합니다. 여기 에 가이드를 따르십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.