2

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

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

活动主.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:(这是第一个活动)

受保护的无效startActivityB(查看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)
4

2 回答 2

2

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

IE

在您拥有的 XML 中:

android:onClick="finishA"

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

public void finishA(View view)
{
}

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

更新

在您的问题中,错误引用了 button2 并且您的 XML 与 button1 有关,因此您应该向我们展示正确的文件。

更新

您的 onClick 处理程序是protected,但它需要与public我上面显示的示例一样。当我在我的应用程序中对此进行测试时,当我将其设置为受保护时,我会遇到同样的错误。

于 2013-05-22T13:35:26.613 回答
2

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

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

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

更新问题后

正如 Devolus 所建议的,您已经为您的函数使用了受保护的访问修饰符,您finishA()应该对同一个函数使用公共而不是受保护。

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

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

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

你可以阅读更多:http ://www.java-made-easy.com/java-access-modifiers.html

这个关于 SO的问题会有所帮助

Activity-A如果你的两者和Activity-B类在同一个包中,你也可以继续在你的函数中使用受保护的访问修饰符,方法是在类Activity-A中创建一个类的对象Activity-B(注意:如果你要使用类名而不创建对象,你将不得不protected static在声明函数时使用。)

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

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

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

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

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

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

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

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

ActivityA.finishA(View v);

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

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

ActivityA.finishA(View v);
于 2013-05-22T13:59:36.427 回答