我是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)
答案 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-A
和Activity-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();
}