web-dev-qa-db-ja.com

Androidデータバインディング:includeタグの可視性

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();
38
Ishaan Garg

あなたがしようとしていることは次のようになると思います:

含めるレイアウトでは、ブール変数を指定し、目的のビューの可視性にバインドします

<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}"/>
59
SeptimusX75

試してください:

this.imageLayout.getRoot().setVisibility(NotifTypeNotificatio1);
3
julzborrego

"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>
3
yoAlex5

最良の方法

  1. Integerのようなvisibility値を直接渡すことができます。
  2. バインディングで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>
2
Khemraj

これは少し遅いですが、最近これに出くわしました。

Android:visibility属性の<include>タグを直接(つまり、データバインディングなしで)。

2
Maks

含まれるレイアウトはそのIDで検索でき、visibility属性を使用して非表示にできます。

たとえば、コトリンでは、

binding.root.findViewById<CardView>(R.id.layout_inclulded).visibility = View.GONE

ここで、

rootは、親レイアウトのルート要素のデフォルト属性です。

CardViewは、私の場合、含まれるレイアウトのルート要素です。

R.id.layout_incluldedは、親レイアウトに含まれるレイアウトのidです。

0
shaheer_