【问题标题】:Making a calculator in android. The app shows up on the emulator with no errors but when I press the calculate button it crashes用安卓做计算器。该应用程序显示在模拟器上没有错误,但是当我按下计算按钮时它崩溃了
【发布时间】:2016-07-31 18:25:02
【问题描述】:

我是新手,我正在尝试遵循另一个答案中的一些代码。我有三个文本字段来输入用于计算的数字,下面的按钮应该将它下面的一些文本更改为答案。运行应用程序时没有显示错误,但是当我按下按钮时应用程序崩溃并且我在日志中收到错误消息。这是代码:

public class CalculatorActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_calculator);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    class NewActivity extends CalculatorActivity {
        //Declare textviews as fields, so they can be accessed throughout the activity.
        EditText editTextSubsPrevious;
        EditText editTextSubsNow;
        EditText editTextDays;
        TextView calcText;
        Button calcButton;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_calculator);

            //Bind the EditText views

            editTextSubsPrevious = (EditText) findViewById(R.id.editTextSubsPrevious);
            editTextSubsNow = (EditText) findViewById(R.id.editTextSubsNow);
            editTextDays = (EditText) findViewById(R.id.editTextDays);

            calcButton = (Button) findViewById(R.id.calcButton);{
                View.OnClickListener onClickListener = new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //When the button is clicked, call the calculate method.
                        calculate();
                    }
                };
            }
        }

        public void calculate(){
            //get entered texts from the edittexts,and convert to integers.
            Double value1 = Double.parseDouble(editTextSubsPrevious.getText().toString());
            Double value2 = Double.parseDouble(editTextSubsNow.getText().toString());
            Double value3 = Double.parseDouble(editTextDays.getText().toString());
            //do the calculation
            Double difference = (value2 - value1) / 7;
            Double percent = (difference / 325);
            Double amount;
            amount = value2 * Math.pow(1 + percent, value3);
            calcText.setText(amount.toString());

        }

    }
}

}

这是错误信息:

FATAL EXCEPTION: main
Process: com.pausetheapp.futurefollowerandsubscribercalculator, PID: 3420
java.lang.IllegalStateException: Could not find method sendMessage(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'calcButton'
     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325)
     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
     at android.view.View.performClick(View.java:5198)
     at android.view.View$PerformClick.run(View.java:21147)
     at android.os.Handler.handleCallback(Handler.java:739)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:5417)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这里是xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.pausetheapp.futurefollowerandsubscribercalculator.CalculatorActivity"
tools:showIn="@layout/activity_calculator">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="@string/textViewTitle"
    android:id="@+id/textViewTitle"
    android:textAlignment="center"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/editTextSubsPrevious"
    android:layout_marginTop="28dp"
    android:layout_below="@+id/textViewTitle"
    android:layout_centerHorizontal="true"
    android:hint="@string/previousSubsTextField"
    android:width="300dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/editTextSubsNow"
    android:layout_below="@+id/editTextSubsPrevious"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="24dp"
    android:width="300dp"
    android:hint="@string/currentSubsTextField" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/editTextDays"
    android:hint="@string/daysTextField"
    android:width="300dp"
    android:layout_marginTop="30dp"
    android:layout_below="@+id/editTextSubsNow"
    android:layout_alignLeft="@+id/editTextSubsNow"
    android:layout_alignStart="@+id/editTextSubsNow" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:text="@string/accuracyText"
    android:id="@+id/textViewAccuracy"
    android:layout_below="@+id/editTextDays"
    android:layout_alignLeft="@+id/editTextDays"
    android:layout_alignStart="@+id/editTextDays"
    android:textSize="10dp" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/calculateButton"
    android:id="@+id/calcButton"
    android:layout_marginTop="42dp"
    android:layout_below="@+id/textViewAccuracy"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="@string/calcDays"
    android:id="@+id/calcText"
    android:layout_marginTop="22dp"
    android:textSize="25dp"
    android:layout_below="@+id/calcButton"
    android:layout_centerHorizontal="true"
    android:gravity="center" />

我刚刚将这一行添加到 java 文件中。

calcText = (TextView) findViewById(R.id.calcText);

【问题讨论】:

  • 其实我刚刚纠正了错误,但按钮仍然不起作用。
  • 看起来您没有在代码中创建 calcText .. 所以如果您尝试在 calcText 上调用 setText (这是空的,因为我没有看到您创建它的位置)应用程序会崩溃..
  • 能否也分享一下您的布局文件?
  • 你班级的积木搞砸了!请注意,您在 onCreate 方法中定义了一个子类。我认为您错过了将代码输入到 SO 问题字段中。如果这确实是您的代码,请尝试在方法实现之外声明您的 NewActivity 类。

标签: java android emulation calculator


【解决方案1】:

有两种可能的错误

1>你还没有定义calcText

 calcText.setText(amount.toString());

2> 或者可能是

 Double value1 = Double.parseDouble(editTextSubsPrevious.getText().toString());
        Double value2 = Double.parseDouble(editTextSubsNow.getText().toString());
        Double value3 = Double.parseDouble(editTextDays.getText().toString());

editTextSubsPrevious,`editTextSubsNow`,`editTextDays` => does not contain numbers so that it can be parsed to `Doubles`

【讨论】:

    【解决方案2】:

    您的布局 XML 文件中可能有以下属性:

     android:onClick="sendMessage"
    

    然后,当你点击时,android搜索方法sendMessage(View view)并没有找到(因为你没有实现)

    在视图类 android.support.v7.widget.AppCompatButton 上定义的 android:onClick 属性的父上下文或祖先上下文中找不到方法 sendMessage(View),id 为“calcButton”

    因此,由于您在运行时设置了onClickListener,我认为您可以从布局文件中删除android:onClick="sendMessage"。

    另外,下面的行应该固定如下:

    calcButton = (Button) findViewById(R.id.calcButton);
    calcButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //When the button is clicked, call the calculate method.
            calculate();
        }
    });
    

    【讨论】:

    • 我将 calcText 添加到 java 中,并删除了 xml 文件中的“sendMessage”。不幸的是,当我按下计算按钮时它仍然不起作用。没有任何变化。
    • 好的..我犯了其他几个错误..例如,您在另一个活动中创建了一个活动..我将在此处模拟您的代码并返回更新。
    • @PauseTheCat 您能否也分享一下 activity_calculator 以准备对您的代码进行适当的修复?
    【解决方案3】:

    在您的布局中,您很可能已经分配了 sendMessage() 方法来处理 onClick 事件,并且没有在活动中创建任何此类方法。

    在您的布局中检查android:onClick="sendMessage"。

    要么创建一个方法 sendMessage(View view) 并在那里编写你的代码,要么删除它并使用你的 calcBtn.setOnClickListner(View.OnClickListner Object)。

    【讨论】:

      【解决方案4】:

      如果您的应用因单击按钮而崩溃,可能是由于以下原因:

      1. 为按钮的 onClick 属性注册的函数 活动中不存在布局中的 .xml 文件。您可以确保 onClick 属性中的函数名称与您要在活动中调用的函数名称匹配。
      2. onClick 函数中的某些内容会导致异常。如果是这种情况,您可以通过在内部设置断点来使用调试器 该功能并在您步进时检查您的代码和值 通过程序。 Debug Your App

      【讨论】:

        【解决方案5】:

        如果你使用这个

            calcButton = (Button) findViewById(R.id.calcButton);{
                            View.OnClickListener onClickListener =         new Button.OnClickListener() {
                               @Override
                                public void onClick(View v) {
                                   //When the button is clicked, call the calculate method.
                                    calculate();
                                }
                            };
                        }
        

        你应该使用

            android:onClick="onClick"
        

        否则你需要使用

                            calcButton.setOnClickListener(new View.OnClickListener(){
                            @Override
                             public void onClick(View v) {
                                //When the button is clicked, call the      calculate method.
                                         calculate();
                                        }
        
              });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多