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


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あるInteger上View、この手段は、あなたがこの作品を作るための2つの方法があり、クラス:

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