web-dev-qa-db-ja.com

Androidデータバインディング-エラー:(119、29)識別子には、XMLファイルのユーザー定義型が必要です。main_radio_subscribeにはありません

Implicit Attribute Listeners( reference )in Android idによってビューにアクセスし、checkedなどの属性にアクセスできるデータバインディングを使用して、ビューの可視性を制御しようとしました、目に見えるなど...しかし、これを使用しようとすると、そのようなエラーがスローされます

Error:(119, 29) Identifiers must have user defined types from the XML file. addTodo_switch_remind is missing it
<Android.support.v7.widget.SwitchCompat
        Android:id="@+id/addTodo_switch_remind"
        style="@style/MediumTextViewStyle"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/addTodo_space_project"
        Android:text="@string/add_todo_remind_label"
        Android:textOff="@string/generic_no_text"
        Android:textOn="@string/generic_yes_text" />

    <Android.support.v4.widget.Space
        Android:id="@+id/addTodo_space_remind"
        style="@style/FormsSpacingStyle"
        Android:layout_below="@+id/addTodo_switch_remind" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/addTodo_space_remind"
        Android:orientation="vertical"
        Android:padding="@dimen/grid_box_single"
        Android:visibility="@{addTodo_switch_remind.checked ? View.VISIBLE : View.GONE}">
15
Mushtaq Jameel

暗黙の属性リスナーが式で使用される場合、キャメルケースを使用するように見えますが、これのおかげで post わかりました。

<!--Recurring Reminder -->
        <Android.support.v7.widget.SwitchCompat
            Android:id="@+id/addTodo_switch_remind"
            style="@style/MediumTextViewStyle"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/addTodo_space_project"
            Android:text="@string/add_todo_remind_label"
            Android:textOff="@string/generic_no_text"
            Android:textOn="@string/generic_yes_text" />

        <Android.support.v4.widget.Space
            Android:id="@+id/addTodo_space_remind"
            style="@style/FormsSpacingStyle"
            Android:layout_below="@+id/addTodo_switch_remind" />

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@id/addTodo_space_remind"
            Android:orientation="vertical"
            Android:padding="@dimen/grid_box_single"
            Android:visibility="@{addTodoSwitchRemind.checked ? View.VISIBLE : View.GONE}">

同じ問題を抱えている他の人のために文書化する

22
Mushtaq Jameel

.xmlファイルでView.VISIBLE/View.GONEを使用する場合、次のようにデータセクションに<import type="Android.view.View"/>を追加してViewタイプをインポートする必要があります。

<data>
    <import type="Android.view.View"/>

    <variable
        name="viewModel"
        type="xx.xx.MyViewModel"/>
</data>
46
Xiaoxi Zhang

ステップ1:create BindingAdapter

@BindingAdapter("Android:visibility")
public static void setVisibility(final View view, @IdRes int layourId) {
    SwitchCompat switcher = (SwitchCompat)view.getRootView().findViewById(layourId)
    switcher.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            view.setVisibility(isChecked ? View.VISIBLE : View.GONE);
        }
    }
}

ステップ2Rクラスをデータバインディングデータセクションにインポートしますlayout.xml

<data>
     <import type="example.package.R"/>
</data>

ステップ3:カスタムビューを次のようにスイッチャーにバインドします。

<Android.support.v7.widget.SwitchCompat
    Android:id="@+id/addTodo_switch_remind"/>

<LinearLayout
    Android:visibility="@{R.id.addTodo_switch_remind">
3
XIII-th