是否可以在按钮xml中添加参数?

时间:2011-04-18 18:02:57

标签: android button android-activity

我目前有一些带按钮的活动。

在我的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,这可能吗?

非常感谢您的帮助。

4 个答案:

答案 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放大。以下步骤的两个版本都使用方法setMainsetMain方法是自动生成的,并使用我们添加的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")}'/>