データバインディングを使用してビューの可視性を設定する


101

Viewカスタム変数を使用する可視性を設定しようとしていますが、エラーが発生します:Identifiers must have user defined types from the XML file. visible is missing it。データバインディングを使用してビューの可視性を設定することは可能ですか?ありがとう。

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

回答:


231

Android開発者ガイドに記載されているように、次のようにする必要があります。

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

6
値を「販売」に設定する方法は?
ロビンフッド2017年

つまり、文字列変数に値「sale」を割り当てる方法を意味しますか?
David Artmann 2017年

丁度!私は問題に直面しています。共有してください私は比較してからあなたに知らせます。
ロビンフッド2017年

40
畜生!愚かな輸入を逃した方法。完了しました、ありがとう。
ロビンフッド2017年

ねえ!スクロールにグリッチを配置する理由はありますか?アダプター
RobinHood 2017年

58

レイアウト内:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

ViewModel Javaコードの場合:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

3
あなたは小さな頭痛から私を救いました
Koen Van Looveren 2017年

2
それが機能するためには、データモデルが監視可能である必要があります。
yshahak

これは、含めに私のために働いた@Bindable。を拡張する提案を含め、さまざまなバインディングエラーが発生していることを含めたときBaseObservable。ここに良いポインタ
Gene Bo

2
受け入れられた答えでなければなりません!それは私のために完全に働いた!
危機的2018

何か提案はありLiveData<Boolean>ますか?
SouravBagchi19年

41

問題は、それがvisibilityあるIntegerView、この手段は、あなたがこの作品を作るための2つの方法があり、クラス:

  1. View.VISIBLEおよびView.GONE定数を使用します。https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. visibilityそのためのカスタムセッターを定義しますBooleanhttps://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

可能な実装:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

どちらが<FrameLayout android:visibility="@{sale}"/>うまくいくでしょう。


4
都合のよい場合、注釈プロセッサはコンパイル中にそれらを自動的に検出します。
Kiskae 2017

ありがとう、BindingUtils.javaに入れました
nhoxbypass 2017

しかし、どのようにバリューセールを設定するのですか?
eslamWael74 2018

1
<includeタグに同じアプローチを適用するにはどうすればよいですか?
Zafer Celaloglu 2018

1
@ EslamWael74 Java / Kotlinコードのバインディングを介して販売額を設定します。val binding = MyClassBinding.inflate(...)のようなもので、binding.sale = trueを呼び出すことができます。
マットロバートソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.