我目前有一些带按钮的活动。
在我的xml中,按钮的定义如下:
<ImageButton (...) android:onClick="GoToPageX"/>
我参加了我的活动:
public void GotoPageX() {
startActivity(new Intent(this, PageX.class));
finish();
}
问题是我有数百个按钮而且不想写
<ImageButton (...) android:onClick="GoToPage1"/>
<ImageButton (...) android:onClick="GoToPage2"/>
<ImageButton (...) android:onClick="GoToPage3"/>
...
<ImageButton (...) android:onClick="GoToPage100"/>
和所有脚本。
我现在正在使用
public void GotoPage( int i) {
startActivity(new Intent(getBaseContext(), activities.get(i)));
finish();
}
并且想从xml中给出参数i,这可能吗?
非常感谢您的帮助。
答案 0 :(得分:92)
这不是直接可能的。但是,也许您可以使用android:tag
来获取参数。
<ImageButton (...) android:onClick="goToPage" android:tag="25"/>
public void goToPage(View v) {
String pageNumber = v.getTag().toString();
/* ... */
}
答案 1 :(得分:2)
如果要在xml中创建一些布局元素,可以使用
<ImageButton
android:id="@+id/some_id_value" />
其中some_id_value
是一种唯一的字符串,它将被转换为保存在R.java中的id(对你来说更好 - 不要改变任何东西),而不是在代码中你可以通过使用< / p>
R.id.some_id_value
读一点there这真的很基础。
答案 2 :(得分:1)
您可以为视图设置标签。标签基本上是视图有记忆的方式。
xml:
<ImageButton
...Other Parameters...
android:id="@+id/Button2"
android:tag="2"
android:onClick="GoToPageX"/>
<ImageButton
...Other Parameters...
android:id="@+id/Button3"
android:tag="3"
android:onClick="GoToPageX"/>
第android:tag="2"
行将标记值2
(字符串数据类型)设置为Button2
Java文件:
一般案例:
在GoToPageX(View v)
内部,
使用v.getTag()
获取相应视图的标记值(从中查看调用该方法)。
您的案例:
添加方法如下
public void GoToPageX(View v){
int i = Integer.parseInt(v.getTag()); //parseInt converts string to integer
startActivity(new Intent(getBaseContext(), activities.get(i)));
finish();
}
答案 3 :(得分:1)
您还可以通过启用数据绑定并对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并将其布局包装在带有layout
部分的data
标签中,如下所示:
<?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
方法是自动生成的,并使用我们添加的name
包装器中的layout
参数的值来命名。由于我们放置了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
,并添加前一个充气机作为其第一个参数。使用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")}'/>
如果计划使用onClick
输入,请确保在String
的值周围使用单引号。
如果确实需要将按钮的视图传递给函数,只需在函数的必需参数中添加一个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")}'/>