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();
}
}
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();
}
}