【问题标题】:Android calculator with button click带有按钮单击的 Android 计算器
【发布时间】:2012-11-13 01:05:09
【问题描述】:

我正在尝试通过添加值 txtA + txtB 来计算名为 lblAnswer 的字段。我对 android 开发世界相当陌生,想知道解决这个问题的最佳方法是什么。我已经将必要的编辑字段添加到 GUI。我现在正在使用 java 文件来尝试创建该方法。此方法已命名为 doCalc。这是我到目前为止所拥有的。

public void doCalc() 
{
    lblAnswer = txtA + txtB;
}

有人建议我在这里添加更多代码是完整的代码。谢谢你的建议。

这里是 Java 文件。

      package com.example.wattsprofessional;

     import android.app.Activity;
     import android.os.Bundle;
     import android.view.Menu;

    public class MainActivity extends Activity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
        }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}


public void doCalc() 
{
    lblAnswer = txtA + txtB;
    Double.parseDouble(txtA.getText().toString());
    lblAnswer.setText"t
}

这里是 xml 文件。

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
              tools:context=".MainActivity" >

    <EditText
           android:id="@+id/txtA"
           android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
             android:layout_centerHorizontal="true"
             android:layout_marginTop="40dp"
            android:ems="10"
            android:hint="Write Here"
            android:inputType="numberDecimal" >

    <requestFocus />
</EditText>

<EditText
    android:id="@+id/txtB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtA"
    android:layout_below="@+id/txtA"
    android:layout_marginTop="32dp"
    android:ems="10"
    android:hint="Second Here"
    android:inputType="numberDecimal" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/calculate" 
    android:onClick="doCalc"/>

<TextView
    android:id="@+id/lblAnswer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="50dp"
    android:text="TextView" />

    </RelativeLayout>

【问题讨论】:

  • 你到底有什么问题?据我们所知,事情进展顺利。我不能给你一个最好的方法,但我要做的就是让我的所有计算都分开接受参数然后返回一个值的方法。
  • 感谢您的快速回复。好吧,当我查看您在上面看到的实际方法时, lblAnswer = txtA + txtB;在它下面有一条错误线。它指出“无法解析为变量”这是所有三个的错误消息。我不确定我在哪里搞砸了。
  • 需要将它们声明为全局变量,然后在onCreate()中初始化。
  • 也许你最好提供更多代码。正如 Dare 所说,您是否将这些值声明为 intsdoubles 或您想使用的任何格式?
  • @Dare。请阅读并理解什么是全局变量。这不是您的建议。

标签: android button methods android-edittext calculated-field


【解决方案1】:

您的代码缺少一些关键组件。查看您的代码,然后查看我在下面准备的代码。

package com.example.wattsprofessional;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    private EditText txtA, txtB;
    private Button button1;
// ^ we have declared these as fields up here so that we can access them throughout the page, past all the curly brackets

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtA = (EditText) findViewById(R.id.txtA);
        txtB = (EditText) findViewById(R.id.txtB);
        button1 = (Button) findViewById(R.id.button1);
        // ^ this is where we initialize these. You did the xml correctly, but you still need to hook the java to it.
        // it allows us to use any names and locations we like not just same ones.
        // basically you say what it is (Button) and then use the following method to look for the id that you wrote in the xml

        initButton();
        // i made this listener so we'd have time. this is the oncreate method and is called instantly.
        // if we called doCalc here, we'd have no time to put numbers in.
    }

    private void initButton() {
        button1.setOnClickListener(new OnClickListener() {
            // this one performs an action when our button is clicked. it performs whatever is below
            @Override
            public void onClick(View v) {
                String strA = txtA.getText().toString();
                String strB = txtB.getText().toString();
                // we get our strings from our editexts. i think you know how to do this well.

                Double dblAnswer = doCalc(strA, strB);              
                // ^we pass them to our method, it does all the heavy lifting for us. and spits an answer for us.
                TextView lblAnswer = (TextView) findViewById(R.id.lblAnswer);
                // this is a local variable, as opposed to a field. i made so you know that you can do it like this - with the whole line here
                // the disadvantage is that we can't do anything to it outside of this curly bracket. but there are performs gains.
                // in general it's wasteful to use fields when you can suffice with local variable
                String answer = String.valueOf(dblAnswer);
                // we get our answer and turn it to a string.
                lblAnswer.setText(answer);
                // finally we set our result to the textView.
            }
        });
    }

    public double doCalc(String a, String b) {
        // a and b are both variables. they refer to the stuff we put in
        double dblA = Double.parseDouble(a);
        double dblB = Double.parseDouble(b);
        // we're gonna make both of these numbers so we can add them. right now they're just text.
        return dblA + dblB;
        // ^ this statement means that this method will spit a number out when it's done which we can use however.
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

【讨论】:

  • 谢谢你迄今为止最好的回应。我同意我有很多教程需要复习。细节帮助很大。
【解决方案2】:

要从 EditText 中获取 Double 值,您需要使用 Double.parseDouble(txtA.getText().toString())。设置文字,可以使用lblAnswer.setText("text")

此外,从按钮调用它的最简单方法是在 XML 中设置其android:onClick 属性,例如android:onClick="doCalc"

编辑:您还需要创建对对象的引用。在你的 onCreate() 之前,放:

EditText txtA;
EditText txtB;
TextView lblAnswer;

然后在你的 onCreate() 中你需要初始化对象:

txtA = new (EditText)findViewById(R.Id.txtA);
txtB = new (EditText)findViewById(R.Id.txtB);
lblAnswer = new (TextView)findViewById(R.Id.lblAnswer);

【讨论】:

  • 谢谢你敢。我现在就去试试这个。用 android:onClick 来支持您在此处所说的内容。我在 GUI 中进行过这个是正确的地方吗?
  • 是的,android:onClick 在您的 GUI 的 XML 文件中。
  • 好吧,所以我对上面的建议有点困惑。我想做的是创建一个计算字段。 txtA + txtB 将是 lblAnswer 的计算字段?
  • 是的。最简单的方法是创建变量来保存来自 EditText 的解析值,然后将文本设置为 Double.toString(num1+num2)(假设 num1 和 num2 是您的变量)。
  • 谢谢你敢。我很抱歉,但我仍在学习,即使这对我来说也有点困惑。我在修改后的编辑中提供了上面的完整代码。我将尝试完成此代码。但我不太确定如何解决这个问题。我明白我应该做什么,但不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
相关资源
最近更新 更多