您也可以通过启用数据绑定并为 onClick 值使用 lambda 表达式来做到这一点。如果您计划使用不同类型的多个输入,这种方式特别有用。这是一个使用此策略的简单 MainActivity.xml 示例。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="main" type="com.example.android.myapp.MainActivity" />
</data>
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton (...) android:onClick='@{() -> main.GotoPage(1,"one")}'/>
<ImageButton (...) android:onClick='@{() -> main.GotoPage(2,"two")}'/>
<ImageButton (...) android:onClick='@{() -> main.GotoPage(3,"three")}'/>
...
<ImageButton (...) android:onClick='@{() -> main.GotoPage(100,"one hundred")}'/>
</LinearLayout>
</layout>
在MainActivity.java
中
public void GotoPage(int i, String otherVariable) {
/** code using i and otherVariable **/
}
更新:对于那些不知道如何设置数据绑定的人,我将在这里解释一下,这样您就不必到处搜索了。首先,在 build.gradle 文件中启用dataBinding:
android {
...
dataBinding {
enabled = true
}
...
}
另外,请确保 jcenter() 在您的存储库中。
然后,转到将使用 onClick 的布局的 XML,并将其布局包装在带有 data 部分的 layout 标记中,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="main" type="com.example.android.yourapp.MainActivity" />
</data>
<YourLayout>
...
</YourLayout>
</layout>
对于variable 标签的type 参数,您需要放置将包含onClick 指向的函数的类。在这个例子中,我将使用主活动类,在我的测试项目中命名为MainActivity。
如上例所示,将布局包裹在 layout 标记中后,请在 Android Studio 中清理项目。您可能还需要使缓存/重启无效或关闭并重新打开 Android Studio。
接下来,如果您尝试为其设置数据绑定的带有onClick 的布局与您的主活动类中setContentView 设置的布局相同,请打开包含您的主活动类的文件。如果您尝试为其设置数据绑定的 onClick 布局以编程方式在不同的文件中膨胀,请打开其中布局膨胀的文件。
将这些导入添加到该文件中:
import com.example.android.yourapp.databinding.YourLayoutBinding;
import android.databinding.DataBindingUtil;
您要导入的第一个类是在您清理项目时生成的(并且可能必须使缓存/重新启动无效),并以您添加 layout 包装器的 XML 文件自动命名。如果布局文件名为your_layout.xml,则导入类将命名为YourLayoutBinding。确切的导入路径取决于您的应用名称和结构,但它始终位于 databinding 父类中。
下一步取决于您要添加数据绑定的布局是使用setContentView 设置还是使用inflate 扩展。以下步骤的两个版本都使用了方法setMain。 setMain 方法是使用我们添加的layout 包装器中的name 参数的值自动生成和命名的。由于我们输入了name="main",因此该方法称为setMain。
如果要添加数据绑定的布局与setContentView 设置的布局相同 在主活动类中找到类似于setContentView(R.layout.your_layout); 的行并将其更改为使用DataBindingUtil.setContentView而不是setContentView,添加this 作为它的第一个参数。使用binding.setMain 将布局的main 变量指向当前活动。
YourLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.your_layout);
binding.setMain(this);
如果您要添加数据绑定的布局不是由setContentView 设置的,而是膨胀的,请转到代码中的膨胀位置。它应该看起来像这样:
return inflater.inflate(R.layout.your_layout, container, false);
修改它以使用DataBindingUtil.inflate,添加之前的inflater 作为它的第一个参数。使用binding.setMain 将布局的main 变量指向主活动,并使用binding.getRoot() 获取视图。最后应该是这样的:
YourLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false);
binding.setMain((MainActivity) getActivity());
return binding.getRoot();
现在数据绑定可以使用了。为onClick 添加一个函数以指向您的主要活动类。
public void exampleFunction(int number, String text) {
System.out.println("Number: " + number + ", Text: " + text);
}
您可以使用 lambda 表达式从添加数据绑定的布局中调用它。此示例函数不需要View,因此可以这样使用:
<Button android:id="@+id/buttonID"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="26sp"
android:text="Test"
android:onClick='@{() -> main.exampleFunction(123, "test")}'/>
如果您打算使用String 输入,请确保在onClick 的值周围使用单引号。
如果您确实需要将按钮的视图传递给您的函数,只需将View 参数添加到您的函数所需的参数中,并改用如下的 lambda 表达式:
<Button android:id="@+id/buttonID"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="26sp"
android:text="Test"
android:onClick='@{(view) -> main.exampleFunction(view, 123, "test")}'/>