android数据绑定<include>布局OnClick监听器dosn工作

时间:2017-04-02 09:25:29

标签: android android-databinding

我有一个数据绑定布局,其中包含一个框架布局,其中包含其他布局:

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

但没有任何帮助..  任何的想法?  thx !!

2 个答案:

答案 0 :(得分:9)

如果要在包含的布局中使用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 answer一个类似的问题。

答案 1 :(得分:5)

的活动:

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>