java.lang.IllegalStateException:无法在活动类中找到方法完成A(视图)

时间:2013-05-22 13:28:32

标签: java android android-intent

我是Android新手。我已经开始使用ActivityLifeCycle应用程序了。在这里我有3个活动类。从第一个活动开始,我想在第一个活动中点击一个按钮时使用意图进入第二个活动类。但它给出了错误。我导入了正确的android.view.View包。

之前有人问过同样的问题,但我没有得到解决方案, 这是容易出错的代码。

activity_main.xml中:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="22dp"
    android:layout_toRightOf="@+id/textView1"
    android:onClick="startActivityB"
    android:clickable="true"
    android:text="startb" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/button1"
    android:layout_below="@+id/button1"
    android:layout_marginTop="31dp"
    android:onClick="finishA"
    android:clickable="true"
    android:text="FinishA" />

<Button

MainActivity.java :(这是第一个活动)

protected void startActivityB(View v){

    Intent intent = new Intent(getApplicationContext(), Activity_B.class);
    startActivity(intent);
}
protected void finishA(View v)
{
    MainActivity.this.finish();
}

这是我在logcat中遇到的错误:

D/Avtivity_A(1333): onStart()of Activity_A started
D/Avtivity_A(1333): onResume()Activity_A started
D/AndroidRuntime(1333): Shutting down VM
W/dalvikvm(1333): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime(1333): FATAL EXCEPTION: main
E/AndroidRuntime(1333): java.lang.IllegalStateException: Could not find a method
     finishA(View) in the activity class com.example.lifecycle.MainActivity for
     onClick handler on view class android.widget.Button with id 'button2'
E/AndroidRuntime(1333):   at android.view.View$1.onClick(View.java:2059)
E/AndroidRuntime(1333):   at android.view.View.performClick(View.java:2408)
E/AndroidRuntime(1333):   at android.view.View$PerformClick.run(View.java:8816)
E/AndroidRuntime(1333):   at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(1333):   at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(1333):   at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(1333):   at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(1333):   at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(1333):   at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(1333):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(1333):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(1333):   at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

在您定义onClick处理程序的活动的xml中,此名称是处理程序的函数名称。我认为你没有实现这个功能。

在您拥有的XML中:

android:onClick="finishA"

在课堂上你必须实现一个功能:

public void finishA(View view)
{
}

不确定这是否是原因,但它看起来像。如果没有,则发布XML和类(它的相关部分)。

<强>更新

在你的问题中,错误引用了button2,你的XML是关于button1的,所以你应该向我们展示正确的文件。

<强>更新

你的onClick处理程序是protected,但它必须是public,就像我上面展示的示例一样。当我在我的应用程序中测试它时,当我保护它时会出现同样的错误。

答案 1 :(得分:2)

在您的代码中,您已在某处调用了一个函数(不在您在问题中提供的代码中)

  

java.lang.IllegalStateException:找不到方法        在活动类com.example.lifecycle.MainActivity中的finishA(View)        视图类android.widget.Button上的onClick处理程序,其id为“button2”

它表示在您的mainActivity中,button2上实现的功能不是您在代码中显示的button1。 它可能包含一行表示对finishA(View v)的调用,当编译器搜索它时,它在类的声明中缺失。

更新问题后

根据Devolus的建议您已经为函数finishA()使用了受保护的访问修饰符,您应该将public用于同一个而不是protected。

如果使用protected作为访问修饰符,则它使该函数仅对类和同一类的子类可用。因此,当您从活动B中调用finishA()时,无法找到finishA()函数。

受保护的变量和方法允许类本身访问它们,同一个包内的类来访问它们,以及该类的子类来访问它们

在使用公共访问修饰符的情况下,该函数将可用于实现类Activity-A的对象的每个类

您可以在以下网址了解详情:http://www.java-made-easy.com/java-access-modifiers.html

关于SO的

this问题会有所帮助

如果您的Activity-AActivity-B类在同一个包中,您还可以继续在函数中使用受保护的访问修饰符,方法是在{{{{}}中创建类Activity-A的对象1}} class(注意:如果要在不创建对象的情况下使用类名,则在声明函数时必须使用Activity-B。)

使用

protected static

将Activity-B类中的方法调用为(仅当两个类在同一个包中时才有效)

protected void finishA(View v)
{
    MainActivity.this.finish();
}

ActivityA obj = new ActivityA ();
obj.finishA(View v);

将Activity-B类中的方法调用为

 public void finishA(View v)
    {
        MainActivity.this.finish();
    }

使用

ActivityA obj = new ActivityA ();
obj.finishA(View v);

将Activity-B类中的方法调用为

 public static void finishA(View v)
    {
        MainActivity.this.finish();
    }

ActivityA.finishA(View v);

将Activity-B类中的方法调用为(仅当两个类在同一个包中时才有效)

 protected static void finishA(View v)
    {
        MainActivity.this.finish();
    }