【问题标题】:android data binding <include> layout OnClick listener doesn't workandroid 数据绑定 <include> 布局 OnClick 侦听器不起作用
【发布时间】:2017-08-27 06:18:56
【问题描述】:

我有一个数据绑定布局,其中包含一个框架布局,其中包含 &lt;include&gt; 的其他布局:

<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 中,我调用了一个函数来收听 On click from the image button:

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

但由于某种原因,当我单击时我没有使用此功能 我也试过了

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

但没有任何帮助。

【问题讨论】:

  • 你是否在包含的布局中绑定数据变量可以通过使用应用程序命名空间和属性中的变量名称从包含布局传递到包含布局的绑定:
  • 我第一次使用包含的绑定,它工作正常,我只包含布局并使用binding.included_layout.textview.setOnClickListener(....)

标签: android android-databinding


【解决方案1】:

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

【讨论】:

  • 嗨,我不认为您也必须在父级中设置侦听器,没有它它对我有用,仅在包含布局中..在我添加的主要活动中:mBinding。包含的.setListener(this);
  • 是的,这也有效。但在这种情况下,您需要为您的 &lt;include /&gt; 分配一个 ID
【解决方案2】:

活动:

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>

【讨论】:

  • 是的,我只是忘记了 setListener,现在很好用!!,
  • 我不能对这个问题保持沉默。经过几天的研究,你救了我。谢谢你:)
  • 很高兴为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
相关资源
最近更新 更多