【问题标题】:why the app crash after calling a method?为什么调用方法后应用程序崩溃?
【发布时间】:2016-07-14 07:37:25
【问题描述】:

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

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 int addResult(int x, int y){
    return x+y;
}

}

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

你好!!!

奇克

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" />

我想这与 null 的可编辑对象有关..但我尝试的任何方法都不起作用。

【问题讨论】:

标签: android android-studio


【解决方案1】:

更改这些代码

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

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

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

【讨论】:

  • 泰!由于某种原因,R. 不存在,但错误仍然存​​在:(
【解决方案2】:

布局中存储的onClick命令需要receiver方法中的参数View v,所以将addResult()改为addResult(View v)

【讨论】:

  • 酷!但现在我应该发送什么参数?加法 x = 新加法(); x.addResult(这里);
  • 如果您不仅从布局调用此方法,请以这种方式调用 addResult(null);
【解决方案3】:

如果我有一个具有更多“操作”、方法的应用程序,是否值得创建 一个包含所有这些操作的类并从主类调用它们?

是的,这是值得的,它会让你的代码更加面向对象。在这种情况下,将类的名称从 Addition 更改为 Operations 会更有意义。此外,加法类不需要是一个活动。所以不要从 MainActivity 扩展它。

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

并在您的 MainActivity 中获取您的 addResult 方法的返回值并 setText 为 edittext3。

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

而你的Addition Class可以是这样的;

public class Addition {

    public int addResult(int param1, int param2){

        return param1 + param2;

    }
}

总结我改了setContentView(R.layout.activity_main); 在 Addition 类中删除 extends MainActivity。 此外,如果错误仍然存​​在,我需要查看您定义文本视图和按钮的 xml 布局

【讨论】:

    【解决方案4】:

    使您的 Textview 静态化。试试

     static TextView num1, num2,num3;
    

    原因

    Addition x = new Addition();
    

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

    【讨论】:

      【解决方案5】:

      使用以下代码。

       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) {}
          }
      }
      }
      

      【讨论】:

      • 谢谢! EditText 有更多的意义!但是当像开始一样按下“添加”按钮时,应用程序会一直崩溃:(
      • 现在它说 num3, num1, num2 “不能解决 simbol”
      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多