http://developer.Android.com/tools/data-binding/guide.html#imports に従って、可視性にこのような単純な式を含めることができます。
<TextView
..
Android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
しかし、include
タグで同じことをしようとすると、次のようになります。
<include
Android:id="@+id/image_layout"
layout="@layout/image_layout"
Android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>
その後、Studioは式を赤で表示するだけでなく、ビルド時に自動生成されたバインディングクラスで次のエラーを生成します。
エラー:(138、29)エラー:シンボルメソッドsetVisibility(int)が見つかりません
自動生成されたバインディングクラスでエラーが発生する場所は次のとおりです。
// batch finished
if ((dirtyFlags & 0x3L) != 0) {
// api target 1
this.imageLayout.setVisibility(NotifTypeNotificatio1);
}
imageLayout.executePendingBindings();
あなたがしようとしていることは次のようになると思います:
含めるレイアウトでは、ブール変数を指定し、目的のビューの可視性にバインドします
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<import type="Android.view.View"/>
<variable
name="isVisible"
type="boolean"/>
</data>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"/>
</layout>
その後、呼び出し元のレイアウトで値をバインドします
<include
Android:id="@+id/image_layout"
layout="@layout/image_layout"
bind:isVisible="@{notification.notifType == 0}"/>
試してください:
this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
"http://schemas.Android.com/apk/res-auto"
名前空間を介して、必要なすべてのパラメーターを親xmlから含まれるxmlに渡すことができます。
構文はres-auto namespace:variable name
です
例えば
<?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">
<Android.support.design.widget.CoordinatorLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include
layout="@layout/include_user_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:isVisible="@{true}" />
</Android.support.design.widget.CoordinatorLayout>
</layout>
include_user_image.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<import type="Android.view.View" />
<variable
name="isVisible"
type="boolean" />
</data>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="@{isVisible ? View.VISIBLE : View.GONE}" />
</layout>
Integer
のようなvisibility
値を直接渡すことができます。default=gone
を設定することでも、visibility
のデフォルト値を設定できます。たとえば、これはincluded_layout.xml
です
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable
name="visibility"
type="int"/>
</data>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="@{visibility, default=gone}"
/>
</layout>
のように使用します
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<import type="Android.view.View"/>
</data>
<include
Android:id="@+id/included_layout"
layout="@layout/included_layout"
app:visibility="@{View.VISIBLE}"/>
</layout>
これは少し遅いですが、最近これに出くわしました。
Android:visibility
属性の<include>
タグを直接(つまり、データバインディングなしで)。
含まれるレイアウトはそのIDで検索でき、visibility
属性を使用して非表示にできます。
たとえば、コトリンでは、
binding.root.findViewById<CardView>(R.id.layout_inclulded).visibility = View.GONE
ここで、
root
は、親レイアウトのルート要素のデフォルト属性です。
CardView
は、私の場合、含まれるレイアウトのルート要素です。
R.id.layout_inclulded
は、親レイアウトに含まれるレイアウトのid
です。