为什么应用程序在调用方法后崩溃?

时间:2016-07-14 07:37:25

标签: android android-studio

我希望你能帮助我,我试图调查其他问题,但我没有找到我想要做的或没有得到它。 这是我正在尝试做的一个非常简单的例子。我有这个主要活动:

public class MainActivity extends Activity {

static EditText num1, num2; //Change EditText from TextView
static TextView num3;       //Textview variable
int x, y, r;

Addition addition=new Addition();

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


    num1=(EditText)findViewById(R.id.editText);
    num2=(EditText)findViewById(R.id.editText2);
    num3=(TextView)findViewById(R.id.textView);

    x = 0;
    y = 0;

}

public void add (View view){
    setXY();
    r=addition.addResult(x,y);
    num3.setText(String.valueOf(r));

}

public void setXY(){
    x=Integer.parseInt(num1.getText().toString());
    y=Integer.parseInt(num2.getText().toString());
}

}

我试图从这个类中调用该方法

public class Addition {

public int addResult(int x, int y){
    return x+y;
}

}

所以在开始时应用程序崩溃是因为从布局中接收到的空值,但在设置了try catch后,应用程序正在运行。当我再次点击“添加”按钮时,问题就出现了。你们能告诉我为什么吗?我究竟做错了什么?我该怎么办?如果我有一个具有更多“操作”方法的应用程序,是否值得创建一个包含所有这些操作的类并从主要操作中调用它们?或者我不应该尝试这样做?

问候!!!

Chiok

  

logcat的

 07-14 14:35:24.625 5407-5407/com.chiok.x2 E/AndroidRuntime: FATAL EXCEPTION: main
                                                        Process: com.chiok.x2, PID: 5407
                                                        java.lang.IllegalStateException: Could not find method addition(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.widget.Button with id 'button'
                                                            at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4479)
                                                            at android.view.View$DeclaredOnClickListener.onClick(View.java:4443)
                                                            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)
07-14 14:35:25.893 5407-5407/com.chiok.x2 I/Process: Sending signal. PID:       5407 SIG: 9

这是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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.chiok.x2.MainActivity">

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/editText"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="48dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/editText2"
    android:layout_below="@+id/editText"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="52dp"
    android:onClick="add" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:layout_below="@+id/editText2"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="71dp"
    android:onClick="addition" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:id="@+id/textView"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="56dp" />

我想它与可编辑的objets有关,但是我没有尝试过。

5 个答案:

答案 0 :(得分:1)

更改这些代码

num1=(TextView)findViewById(R.id.editText);
num2=(TextView)findViewById(R.id.editText2);
num3=(TextView)findViewById(R.id.editText3);

import { Injectable } from 'angular2/core';
import { Http, Response } from 'angular2/http';

const myFirebase = 'https://*****.firebaseio.com';

@Injectable()
export class FirebaseService {
    constructor(private _http: Http) {}

    getPages() {
        return this._http.get(myFirebase + '/pages_name.json')
            .map((res:Response) => res.json());
    }
}

并记得在项目中导入R.java。

答案 1 :(得分:1)

存储在布局中的

onClick命令需要参数View v in receiver方法,所以将addResult()更改为addResult(View v)

答案 2 :(得分:0)

使用以下代码。

 public class MainActivity extends Activity {

EditText num1, num2; //Change EditText from TextView
TextView num3;       //Textview variable 
Button add;          //Button variable


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


    num1=(EditText)findViewById(R.id.editText);  //R.id.editText
    num2=(EditText)findViewById(R.id.editText2); //R.id.editText2
    num3=(TextView)findViewById(R.id.textview); // initialize textview
    add=(Button) findViewById(R.id.add);        //initialize add button

    final Addition x = new Addition();
    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         x.addResult();
        }
    });
}
}

public class Addition {

    public void addResult(){
        try {
            num3.setText(String.valueOf((Integer.parseInt(num1.getText().toString())+(Integer.parseInt(num2.getText().toString())))));
        }
        catch (Exception e) {}
    }
}
}

答案 3 :(得分:0)

使Textview保持静态。尝试

 static TextView num1, num2,num3;
  

<强>原因

Addition x = new Addition();
     

在上面的代码中,它正在创建 Addition 类的新实例,它扩展了 MainActivity ,因此TextView将 NULL 对于新实例。为了使TextView初始化可用于所有实例,请使TextView 静态

答案 4 :(得分:0)

  

如果我的应用程序包含更多&#34;操作&#34; ,方法,值得创造   一个包含所有这些操作的类,并从主要操作中调用它们?

是的,值得的是,它会使您的代码更加面向对象。在这种情况下,如果将类的名称从“添加”更改为“操作”,则更有意义。此外,Addition类不需要是一个活动。所以不要将其从MainActivity扩展。

只需向该方法发送两个参数,并使addResult 返回一个int 结果,这是添加这两个参数。

在MainActivity中获取addResult方法和setText的返回值edittext3。

class ChangeColumnTypeClientStatus < ActiveRecord::Migration
  def change
    change_column :clients, :status,  :integer, default: 0
  end
end

你的加法课可以是这样的;

public class MainActivity extends Activity {

TextView num1, num2,num3;

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

    num1=(TextView)findViewById(R.id.editText);
    num2=(TextView)findViewById(R.id.editText2);
    num3=(TextView)findViewById(R.id.editText3);

    // here I am trying to call the method
    Addition x = new Addition();
    int param1 = Integer.parseInt(num1.getText().toString());
    int param2 = Integer.parseInt(num2.getText().toString());
    int result = x.addResult(param1, param2);
    num3.setText(String.valueOf(result));
  }
}

摘要我更改了public class Addition { public int addResult(int param1, int param2){ return param1 + param2; } } 在Addition课程中删除setContentView(R.layout.activity_main);。 此外,如果错误仍然存​​在,我需要查看 xml layout ,您可以在其中定义文本视图和按钮。