web-dev-qa-db-ja.com

LiveDataを使用してTextViewの可視性を設定する

LiveDataを使用してTextViewの表示を切り替えたいのですが。データバインディングで可視性を設定することについて他にもいくつかの投稿がありますが、これらはObservableを使用していますが、私は(新しい)LiveDataを活用したいと考えています。特に、LiveDataを使用します。

このドキュメント といくつかのSO投稿を使用して、戻り値の型が設定するビュー属性のセッターが期待するタイプ具体的には:

  • viewのsetVisibility()にはintが必要ですが、LiveDataメンバーがあるので(私のViewModelのゲッターもこの型を返します)
  • このブール値をView.VISIBLEおよびVIEW.GONEに変換することは、三項演算子を使用して可能です。 XML式にsafeUnbox()を追加して、プリミティブなブール値にする必要もあります

これらの洞察を使用して、私のViewModelクラスで、以下を定義しました。

MutableLiveData<Boolean> textHintVisible;

ボタンを押した後、この値をFalseに設定しました。

textHintVisible.postValue(false);

(注、setValue()でも試しました)

次に、レイアウトXMLに以下を含めました。

<TextView
   Android:visibility="@{(safeUnbox(viewModel.textHintVisible) ? View.VISIBLE : View.GONE)}"
/>

しかし、それでも、私のTextViewは常に表示されています。デバッグするために、アクティビティにオブザーバーを追加しました。これにより、ブール値がtrueとfalseの間で正しく切り替えられていることが確認できます。

mHintsViewModel.getTextHintVisible().observe(this, new Observer<Boolean>() {
   @Override
   public void onChanged(@Nullable Boolean newInt) {
        Log.i(TAG,"onChanged: "+newInt);
   }
});

しかし、私のTextViewは常に表示されたままです。何が悪いのですか?これにLiveDataを使用することは不可能ですか?追加のコンバーターを使用する必要がありますか?または私のコードは原則的に正しいですが、これはAndroid Studioのバグですか?)どんな助けでも大歓迎です。

10
user3820186

私が心に留めていることの1つは、liveDataを監視するようにバインディングを設定しましたか? documentation に従って、ライフサイクルを監視するためにバインディングレイアウトを設定する必要がありますbinding.setLifecycleOwner(this)

14
mlyko