Android:调用用户定义的方法导致应用程序行为异常

Android : calling a user defined method causing application misbehave

    public void onClick(View v) {
        Level1 ob = new Level1();
        ob.checkAns();
        int id = v.getId();
        String typed = ans.getText().toString();

        String resourceName = getResources().getResourceEntryName(id);
        ans.setText(typed + resourceName);


//      String check =ans.getText().toString();
//
//      if(check.equalsIgnoreCase("ABC")){
//          Toast.makeText(Level1.this, "correct" ,Toast.LENGTH_SHORT).show();
//      }
//      else {
//          Toast.makeText(Level1.this, "NO" ,Toast.LENGTH_SHORT).show();
//      }
//  }

给定的代码是我的 onClick() 方法。 评论区是我有兴趣制作方法的部分。像这样:

public  void checkAns() {
        String check =ans.getText().toString();

        if(check.equalsIgnoreCase("ABC")){
            Toast.makeText(Level1.this, "correct" ,Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(Level1.this, "NO" ,Toast.LENGTH_SHORT).show();
        }
    }

我想在我的 onClick 方法中调用它,如 onClick() 方法所示,即:

`public void onClick(View v) {
        Level1 ob = new Level1();
        ob.checkAns();....

Level1 是我的 class 名字。 我的问题是,当我从 onClick() 调用方法 checkAns() 并单击任何按钮时,我的应用程序停止了 当我在 onClick() 中使用 checkAns() 代码的相同代码并删除 checkAns() 的调用语句时,应用程序工作正常。 希望我的问题是可以理解的。 请帮助。

更新:我的 Level1 class。

    package com.example.letsguesssomething;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class Level1 extends Activity implements OnClickListener{


    ImageButton A,B,C,D,E,F,G,H,I,J;
    TextView ans;


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

        A = (ImageButton) findViewById(R.id.A);
        B = (ImageButton) findViewById(R.id.B);
        C = (ImageButton) findViewById(R.id.C);
        D = (ImageButton) findViewById(R.id.D);
        E = (ImageButton) findViewById(R.id.E);
        F = (ImageButton) findViewById(R.id.F);
        G = (ImageButton) findViewById(R.id.G);
        H = (ImageButton) findViewById(R.id.H);
        I = (ImageButton) findViewById(R.id.I);
        J = (ImageButton) findViewById(R.id.J);
        ans = (TextView) findViewById(R.id.ans);
        A.setOnClickListener(this);
        B.setOnClickListener(this);
        C.setOnClickListener(this);
        D.setOnClickListener(this);
        E.setOnClickListener(this);
        F.setOnClickListener(this);
        G.setOnClickListener(this);
        H.setOnClickListener(this);
        I.setOnClickListener(this);
        J.setOnClickListener(this);

    }



    @Override
    public void onClick(View v) {
        //Level1 ob = new Level1();
        //ob.checkAns();
        int id = v.getId();
        String typed = ans.getText().toString();

        String resourceName = getResources().getResourceEntryName(id);
        ans.setText(typed + resourceName);


        String check =ans.getText().toString();

        if(check.equalsIgnoreCase("ABC")){
            Toast.makeText(Level1.this, "correct" ,Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(Level1.this, "NO" ,Toast.LENGTH_SHORT).show();
        }
    }



    }
public  void checkAns() {
    String check =ans.getText().toString();

    if(check.equalsIgnoreCase("ABC")){
        Toast.makeText(Level1.this, "correct" ,Toast.LENGTH_SHORT).show();
    }
    else {
        Toast.makeText(Level1.this, "NO" ,Toast.LENGTH_SHORT).show();
    }
}

}

要获得正确答案,您必须提供问题的堆栈跟踪。 ans.getText() 中使用的 ans 变量可能有问题。您是否检查过它是否分配了 not-null 值?

对了,你的Level1class是Activityclass的扩展吗?因为您正在使用 Level1.this 作为为 Toast 提供的上下文。 在这种情况下,问题可能出在您初始化 Level1 对象的方式上。用构造函数实例化 Activity 并不常见。

编辑:

重点是您永远不应该像在 Leve1 ob = new Level1() 中那样在 activity class 中创建 Activity 对象。您可以替换

Level1 ob = new Level1();
ob.checkAns();

checkAns();

checkAns 函数移动到您的activity class,而不是移出它。 由于 checkAns() 是 Level1 class 的一种方法,您可以在 non-static class 函数中的任何地方调用它,其中当然包括 onClick 方法。

下面的代码应该可以正常工作。

public class Level1 extends Activity implements OnClickListener{

    ImageButton A,B,C,D,E,F,G,H,I,J;
    TextView ans;


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

        A = (ImageButton) findViewById(R.id.A);
        B = (ImageButton) findViewById(R.id.B);
        C = (ImageButton) findViewById(R.id.C);
        D = (ImageButton) findViewById(R.id.D);
        E = (ImageButton) findViewById(R.id.E);
        F = (ImageButton) findViewById(R.id.F);
        G = (ImageButton) findViewById(R.id.G);
        H = (ImageButton) findViewById(R.id.H);
        I = (ImageButton) findViewById(R.id.I);
        J = (ImageButton) findViewById(R.id.J);
        ans = (TextView) findViewById(R.id.ans);
        A.setOnClickListener(this);
        B.setOnClickListener(this);
        C.setOnClickListener(this);
        D.setOnClickListener(this);
        E.setOnClickListener(this);
        F.setOnClickListener(this);
        G.setOnClickListener(this);
        H.setOnClickListener(this);
        I.setOnClickListener(this);
        J.setOnClickListener(this);

    }



    @Override
    public void onClick(View v) {
        int id = v.getId();
        String typed = ans.getText().toString();

        String resourceName = getResources().getResourceEntryName(id);
        ans.setText(typed + resourceName);

        checkAns();

    }



    public  void checkAns() {
        String check =ans.getText().toString();
        if(check.equalsIgnoreCase("ABC")){
            Toast.makeText(Level1.this, "correct" ,Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(Level1.this, "NO" ,Toast.LENGTH_SHORT).show();
        }
    }
}

注意1:
如果你使用了我们Level1class中的所有逻辑,为什么要初始化一个相同class的对象并调用方法???可以直接调用checkAns()

Level1 ob = new Level1();
ob.checkAns();

注意2:你有没有在onCreate()中初始化你的编辑文本?

EditText ans;
ans=(EditText)findViewById(....);


这将起作用: activity_main.xml如下

<ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imgBtn"
            android:src="@drawable/van"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txtView"
            android:text="ABC"
            />

Activity代码:

class MainActivity extends AppCompatActivity implements  View.OnClickListener{
ImageButton btn;
    TextView txt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn=(ImageButton)findViewById(R.id.imgBtn);
        btn.setOnClickListener(this);
        txt=(TextView)findViewById(R.id.txtView);
}
@Override
    public void onClick(View v) {
        if(v.getId()== R.id.imgBtn){
            check(v.getId());
        }
    }
    private void check(int id){
        String resourceName = getResources().getResourceEntryName(id);
        String typed = txt.getText().toString();
        txt.setText(id+resourceName);
        Toast.makeText(this,"test",Toast.LENGTH_SHORT).show();
    }
}