質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2259閲覧

includeタグの内部レイアウトをdatabindingで指定する

rear

総合スコア1

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/08/20 06:24

前提・実現したいこと

databindingにてレイアウトをincludeで指定する際に、
includeの中身のレイアウト自身をdatabindingで変更することは可能でしょうか?

発生している問題・エラーメッセージ

android.databinding.tool.processing.ScopedException: [databinding] {"msg":"included value (@{viewModel.cardImage}) must start with @layout/."......

該当のソースコード

aiueo_fragment.xml

1<include 2 android:id="@+id/card" 3 layout="@{viewModel.cardImage}" 4... 5/>

aiueo_viewModel.kt

1fun initCard(){ 2 when (a){ 3 1 -> cardImage.postValue(R.layout.included_layout1) 4 2 -> cardImage.postValue(R.layout.included_layout2) 5 3 -> cardImage.postValue(R.layout.included_layout3) 6 } 7}

試したこと

viewModel.cardImageという形で、
viewModel側で中身のレイアウトを指定してみたのですが、
ビルドの時点でエラーが発生するので、やはりlayout自身は必須の項目になってしまって、
bindingで調整することは厳しいのでしょうか?

また。別の解決策として、
Fragmentのレイアウトの中にfragment container作り、
表示中のフラグメントの中に新たに別フラグメントを表示することは可能でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rear

2021/08/23 02:24

ご連絡ありがとうございます。 こちらでviewmodelの指定はできていたのですが、 レイアウト自体を変更したい場合にどうすれば良いのかがわかりませんでした。 tshionさんのご提案の通り、 visibilityで表現すれば問題ないことに気づきました。 ありがとうございました!
guest

回答1

0

ベストアンサー

私の知る限りではありますが、
"include" タグの"layout" 属性を
databinding などを使って動的に変更するのは難しいと思います。

なので他の方法を試した方が良いと思っているのですが、
申し訳ないですが、全体像を読み切れなかったので、これっといった回答は出来なさそうです。

  • "include" タグを"layout" で指定したい数だけ記述して、"android:visibility" で制御する
  • 1アイテムだけしか表示しない"RecyclerView" などを埋め込んで、Adapter で頑張って表示を切り替える
  • "FrameLayout" などを仮置きして、動的に表示のDOM を追加する("addView()" とかをゴリゴリ書く)
  • "layout" で指定したい表示をFragment でくるんで、適宜Fragment を切り替えていく("試したこと" に書いてくださった内容)

※hoshi-takanori さんが指摘してくださった通り、"include" タグにもViewModel を紐づけることができます。
なので、例えばincluded_layout1, included_layout2, included_layout3 をまとめたレイアウトファイルを用意して、与えられたViewModel のデータによって内部的に変化させるのもありかもです。

投稿2021/08/21 02:37

編集2021/08/21 02:44
tshion

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rear

2021/08/23 02:18

ご回答ありがとうございます。 今回の問題の背景の説明が薄く大変失礼いたしました。 今回実装しようとしていた要件としては、 3つのレイアウトテンプレートをパラメーターに合わせて表示切り替えを行う形で、 パラメーターによってdatabindingでレイアウトを切り替えようと考えておりましたが、 tshionさんがおっしゃる通りvisibilityで表現すれば、 特に問題ないのかなと思いました。 (なぜその選択肢に気づかなかったのか...) 大変助かりました。 ありがとうございました!
rear

2021/08/23 02:20 編集

すみません2回同じコメントしてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問