android data binding <include> layout OnClick listener doesn't work

依然范特西╮ 提交于 2019-12-30 09:09:08

问题


I have a data binding layout that contains a frame layout with <include> of other layout inside:

<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>

the layout has image buttons inside in this format:

<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"/>

and I added the tag around them and I added data with name of activity

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

and in MyActivity I called a function to listen to On click from the image buttons:

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

but from some reason I don't get to this function when I click I tried also

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

but nothing helped.


回答1:


Activity:

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>



回答2:


If you want to use DataBinding variables in an included layout, you need to pass them to the included layout, and also make your parent view use 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>

You need to set your listener in your MainActivity.class to the corresponding binding class:

activityMainBinding.setListener(this);

and in your included layout, you need to use the same name that you used in your parent layout (app:listener):

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

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

Please take a look at George Mounts answer to a similiar question.



来源:https://stackoverflow.com/questions/43166731/android-data-binding-include-layout-onclick-listener-doesnt-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!