【问题标题】:Can I pass a parameter from a layout XML to a method in the MainActivity?我可以将布局 XML 中的参数传递给 MainActivity 中的方法吗?
【发布时间】:2015-04-11 16:30:22
【问题描述】:

如果这是一个菜鸟问题,我很抱歉,但我对 XML 和整个 Android 都是新手。

我正在 Android 中制作一个基本的计算器,基本上我想编写一个方法来处理所有的数字按钮按下。我想像这样将参数从 XML 传递到方法中..

 <Button
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/button_8"
        android:textSize="40dp"
        android:onClick="num_pressed(8)" 
 />

并让主要活动中的该方法对该数字执行任何操作(我还没有决定如何处理它,但这不是我的问题的一部分)。

为了澄清,在我的应用程序中,我有数字 0-9 的按钮,符号“+”、“-”、“*”、“/”、“。”和“C”。与其为每个数字编写单独的方法,我认为让所有数字都使用相同的方法会更有效,并且只需传入一个变量,这样它就可以以相同的方式对它们都起作用。

我可以这样做还是必须完全不同?

【问题讨论】:

  • 那你想要什么?对所有按钮使用一种方法?
  • 是的,如果我没有说清楚,对不起。我希望按钮 0-9 有一个通用的方法,其他按钮可能会有自己的方法。

标签: java android xml methods parameter-passing


【解决方案1】:

按照以下代码获取按钮事件。

public void num_pressed(View view) {

        switch (view.getId()) {
        case R.id.button1:
            //perform operation
            break;

        case R.id.button2:
            //perform operation
            break;
        case R.id.button3:
            //perform operation
            break;
        case R.id.button4:
            //perform operation
            break;
        case R.id.button5:
            //perform operation
            break;
        case R.id.button6:
            //perform operation
            break;
        case R.id.button7:
            //perform operation
            break;
        case R.id.button8:
            //perform operation
            break;
        case R.id.button9:
            //perform operation
            break;
            case R.id.buttonplus:
                //perform operation
                break;
        default:
            break;
        }

        }

【讨论】:

  • 啊,是的,我记得在大学里做过类似这样的代码,这可能会有所帮助!谢谢。
  • 我最终使用了类似的方法,非常感谢您的回复!
【解决方案2】:

不,您不能将参数传递给方法,但您可以为视图设置标签并在代码中检查它。 为您的 Button 设置标签的简单方法:

 <Button
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/button_8"
        android:textSize="40dp"
        android:onClick="num_pressed"
        android:tag="8"
 />

在你的代码中,你可以这样做:

public void num_pressed(View view) {
  String a = (String) view.getTag(); // here will be 8 for button.
}

【讨论】:

    【解决方案3】:

    您不能从 XML 传递参数,但可以这样做,

    您在 strings.xml 中:8
    您在 layout.xml 中:

    <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="@string/button_8"
            android:textSize="40dp"
            android:onClick="num_pressed" 
     />
    

    在活动中为数字执行此操作:

    public void num_pressed(View view) {
        int number = Integer.parseInt(((Button) view).getText().toString());
    }
    

    编辑:同样,符号只是跳过解析为整数,我建议对数字和符号有两种不同的方法,因为(正如你所说)在计算器中,这些键的工作会有很大不同。

    【讨论】:

    • 感谢您的回复!我想我最终会在某个时候解析变量,所以这应该会有很大帮助。
    • @bansal21ankit 解析按钮上的文本不是一个好主意。对于这种情况,所有视图都有“标签”。
    • @Demand 我认为解析文本没有问题,而且为什么要附加另一个属性或一起添加一个新字符串。
    • @bansal21ankit 这很糟糕,因为它有不同的逻辑。我认为将您的登录名链接到您的代表是不好的。例如,明天您将需要向按钮添加图标而不是文本,您的解决方案将不再有效。我认为,您必须使用不会将您的表示与逻辑联系起来的工具。
    • @Demand 感谢您的指点,但现在争论是浪费......他只是选择了最糟糕的答案作为正确的答案。
    【解决方案4】:

    您可以在单击按钮时调用方法。此外,您可以在 xml 中为视图(在您的情况下为按钮)分配标签。 (标签基本上是视图拥有记忆的一种方式。)

    为了清楚起见,使用android:onClick="MethodName" 来设置调用哪个方法。并使用android:tag="tagValue" 为每个视图分配标签。可以使用方法中的view.getTag() 检索标签。

    示例代码:
    xml:

    <Button
        ...Other Parameters...
        android:id="@+id/Button2"
        android:tag="2"
        android:onClick="method1"/>
    <Button
        ...Other Parameters...
        android:id="@+id/Button3"
        android:tag="3"
        android:onClick="method1"/>
    

    Java:

    public void method1(View v){
        String tagValue = (String) v.getTag();
        if(tagValue.equals("2")){
            // add relevant code here
        }
        else if(tagValue.equals("3")){
            // add relevant code here
        }
        //complete the ramaining code
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 2011-02-19
      • 2011-02-24
      相关资源
      最近更新 更多