web-dev-qa-db-ja.com

androidデータバインディング<include>レイアウトOnClickリスナーが機能しない

他のレイアウトの<include>を含むフレームレイアウトを含むデータバインディングレイアウトがあります。

<FrameLayout
    Android:id="@+id/global_actions_frame_layout"
    Android:layout_width="match_parent"
    Android:layout_height="0dp"
    Android:layout_weight="0.075"
    Android:background="@color/colorToolBar">
    <include
        Android:id="@+id/included"
        layout="@layout/global_actions">
    </include>
</FrameLayout>

レイアウトには、次の形式の画像ボタンがあります。

<ImageButton
    Android:id="@+id/settingsButton"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:src="@drawable/ic_settings_black_36dp"
    Android:layout_gravity="end"
    Android:background="@color/colorToolBar"
    Android:layout_margin="4dp"
    Android:layout_marginLeft="20dp"
    Android:onClick="@{listener::onClickState}"
Android:alpha="0.4"/>

それらの周りにタグを追加し、アクティビティの名前を含むデータを追加しました

 <data>
    <import type="Android.view.View"/>
    <variable name="listener" type="MyActivity"/>
</data>

myActivityでは、画像ボタンからクリックするとリッスンする関数を呼び出しました。

public void onClickState(View view){
int id = view.getId();
}

でもどういうわけかクリックしてもこの機能が出ないので試してみました

 Android:onClick="@{listener.onClickState}"

しかし、何も助けにはなりませんでした。

7
batsheva

アクティビティ:

activityMainBinding.included.setListener(this);

global_actions.xml ::

<layout>
    <data>
        <variable type="your.packages.here.MainActivity" name="listener"/>
    </data>

    <ImageButton
    Android:id="@+id/settingsButton"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:src="@drawable/ic_settings_black_36dp"
    Android:layout_gravity="end"
    Android:background="@color/colorToolBar"
    Android:layout_margin="4dp"
    Android:layout_marginLeft="20dp"
    Android:onClick="@{listener::onClickState}"
    Android:alpha="0.4"/>
</layout>
5
CodeCameo

インクルードレイアウトでDataBinding変数を使用する場合は、それらをインクルードレイアウトに渡し、親ビューでDataBindingを使用するようにする必要があります。

<layout>
    <data>
        <variable type="your.packages.here.MainActivity" name="listener"/>
    </data>

    <FrameLayout>
        <include
            Android:id="@+id/included"
            layout="@layout/global_actions"
            app:listener="@{listener}"/>
        </include>
    </FrameLayout>
</layout>

MainActivity.classのリスナーを対応するバインディングクラスに設定する必要があります。

activityMainBinding.setListener(this);

含まれているレイアウトでは、親レイアウトで使用したのと同じ名前を使用する必要があります(app:listener):

<layout>
    <data>
        <variable type="your.packages.here.MainActivity" name="listener"/>
    </data>

    <ImageButton 
     Android:onClick="@{listener::onClickState}"/>
</layout>

同様の質問に対して George Mountsの回答 をご覧ください。

11
yennsarah