포함 태그를 사용하는 Android 데이터 바인딩


116

업데이트 참고 :

위의 예는 적절히 작동 해제 1.0 RC4 때문에, 고정 불필요한 가변 필요의 문제.

원래 질문 :

문서에 설명 된대로 정확히 수행하지만 작동하지 않습니다.

main.xml :

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

buttons.xml :

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java :

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

버튼을 얻는 방법?

답변:


206

문제는 포함 된 레이아웃이 데이터 바인딩 된 레이아웃으로 간주되지 않는다는 것입니다. 하나의 역할을하려면 변수를 전달해야합니다.

buttons.xml :

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

main.xml :

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

그런 다음 버튼 필드를 통해 간접적으로 버튼에 액세스 할 수 있습니다.

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

1.0-rc4 (방금 출시됨)부터는 더 이상 변수가 필요하지 않습니다. 다음과 같이 단순화 할 수 있습니다.

buttons.xml :

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

main.xml :

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

6
1.0-rc4는 이제 불필요한 변수가 필요한 문제를 해결합니다. 이제 간단하게 사용할 수 있습니다 <include layout="@layout/buttons" android:id="@+id/buttons"/>.. 단추보기에 액세스 할 수 있도록 공용 필드를 생성하려면 여전히 ID가 필요합니다.
George Mount

1
다른 사람이 레이아웃에서 클릭 이벤트를 바인딩하는 데 문제가 있습니까?
Nilzor

5
포함 지원을 통한 데이터 바인딩. developer.android.com/topic/libraries/data-binding/…
sowmia jul.

1
여기서 기억해야 할 요점은 버튼 참조를 얻는 binding.{id of include tag}.button것입니다 binding.button. 대신 . 그것을 알아내는 데 시간이 걸렸습니다.
Rishabh876

1
@NeonWarge developer.android.com/topic/libraries/data-binding/…에 완전한 예제가 있습니다. "데이터 바인딩은 병합 요소의 직접적인 자식으로 포함을 지원하지 않습니다"를 추가합니다.
Ewan

38

쉬운 완전한 예

id포함 된 레이아웃으로 설정 하고 binding.includedLayout.anyView.

이 예제 <include는 코드에 포함 된 뷰에 값을 전달하고 액세스 하는 데 도움이됩니다 .

1 단계

이 있습니다 . 포함 된 레이아웃 layout_common.xml으로 전달 String하려고합니다.

String레이아웃에 변수를 생성 String하고 TextView.

<data>
    // declare fields
    <variable
        name="passedText"
        type="String"/>
</data>

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.

2 단계

이 레이아웃을 상위 레이아웃에 포함합니다. id포함 된 레이아웃에 제공하여 바인딩 클래스에서 사용할 수 있도록합니다. 이제 태그에 String passedText을 전달할 수 있습니다 <include.

activity_main.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">

    <LinearLayout
        ..
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>
  • 이제 binding.includedLayout.textView수업에서 사용할 수 있습니다 .
  • 위와 같이 포함 된 레이아웃에 모든 변수를 전달할 수 있습니다.

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.includedLayout.textView.setText("text");

참고 두 레이아웃 (상위 및 포함)은 모두 binding layout,<layout


귀하의 답변에서 TextView 대신 Button이었을 경우 프로그래밍 방식으로 setText 이벤트를 처리 한 다음 클릭 이벤트를 어떻게 처리 했습니까? 프로그래밍 방식으로 binding.includedLayout.button.setOnClickListener대안이 될 것이라는 것을 알고 있지만 onClickXML에서 속성 을 사용하려면 어떻게해야합니까? 그 자체?
iCantC

OnClickListener포함 된 레이아웃으로 전달할 수 있습니다 . 바인딩에서 무엇이든 전달할 수 있습니다. 이 답변을 확인하고 도움이 더 필요하면 알려주세요. stackoverflow.com/a/51722829/6891563
Khemraj

1
이 작업을 수행하면 passedText. 유일한 차이점은 <include>에 문자열 리소스를 전달하고 그대로두고 싶기 때문에 MainActivity 코드를 포함하지 않는다는 것입니다. 왜 항상 비어 있습니까?
Elliptica

3

이것에 대한 또 다른 흥미로운 점은 다음과 같이 바인더에서 가져온 레이아웃에 변수를 지정할 수 있다는 것입니다.

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)

3

다음과 같이 ID를 추가하기 만하면 include에서 바인딩이 작동하도록 할 수 있습니다.

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

2

포함 레이아웃에 대한 ID를 설정하십시오.

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

그때

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING res / layout / buttons.xml입니다.

지금 :

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