我正在尝试使我的Android应用程序更加面向对象,并创建一个类(DigitHandler)来选择从某种类型的输入调用哪个活动。当用户单击另一个名为InputCodeActivity的类中的按钮时,将调用DigitHandler。
DigitHandler调用此launchGame方法:
private void launchGame()
{
Intent intent;
switch(digits[0])
{
case 0:
// Set random game from among the first three.
int randNum = (int)(Math.random() * 3) + 1;
digits[0] = randNum;
// Not sure whether that will work or just have it continue to 1.
// Not that important at the moment, since random game isn't in the specs.
case 1:
intent = new Intent(ctx, SimonActivity.class);
break;
case 2:
intent = new Intent(ctx, SquareActivity.class);
break;
case 3:
intent = new Intent(ctx, PegsActivity.class);
break;
case 4:
intent = new Intent(ctx, PipesActivity.class);
break;
default:
intent = new Intent(ctx, LightsActivity.class);
}
String difficulty = "";
switch(digits[2])
{
case 1:
difficulty = "easy";
break;
case 2:
difficulty = "medium";
break;
case 3:
difficulty = "hard";
break;
}
intent.putExtra(GameActivity.DIFFICULTY, difficulty);
// intent.putExtra(GameActivity.ADDITIONAL_PARAMS, barcodeData.additionalParams);
ctx.startActivity(intent);
}
但是最后一行(开始活动)给了我一个错误。 (我知道这是最后一行,因为如果我评论该行,我没有得到错误。)我真的不知道是什么导致错误。这是错误和堆栈跟踪:
java.lang.IllegalStateException: Could not execute method of the activity
--------- Stack trace ---------
android.view.View$1.onClick(View.java:3841)
android.view.View.performClick(View.java:4456)
android.view.View$PerformClick.run(View.java:18465)
android.os.Handler.handleCallback(Handler.java:733)
android.os.Handler.dispatchMessage(Handler.java:95)
android.os.Looper.loop(Looper.java:136)
android.app.ActivityThread.main(ActivityThread.java:5086)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
dalvik.system.NativeStart.main(Native Method)
-------------------------------
--------- Cause ---------
java.lang.reflect.InvocationTargetException
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
android.view.View$1.onClick(View.java:3836)
android.view.View.performClick(View.java:4456)
android.view.View$PerformClick.run(View.java:18465)
android.os.Handler.handleCallback(Handler.java:733)
android.os.Handler.dispatchMessage(Handler.java:95)
android.os.Looper.loop(Looper.java:136)
android.app.ActivityThread.main(ActivityThread.java:5086)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
dalvik.system.NativeStart.main(Native Method)
-------------------------------
--------- Device ---------
Brand: motorola
Device: condor_cdma
Model: XT830C
Id: KXC21.5-40
Product: condor_tracfone
-------------------------------
--------- Firmware ---------
SDK: 19
Release: 4.4.4
Incremental: 35
-------------------------------
知道我做错了吗?
编辑:上下文是getApplicationContext(),从当前Activity中的okButtonClick()方法传递,如下所示:
public void okButtonClick(View view)
{
theNumber = numberPad.getText().toString();
Log.e("Recording the number", "Number is"+theNumber);
DigitHandler dh = new DigitHandler(getApplicationContext(), theNumber);
}
DigitHandler的构造函数查找上下文(在DigitHandler中变为ctx并传递给launchGame())和字符串theNumber。
编辑:使用try-catch块我在InvocationTarget中找到了实际的异常: “从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?”
所以它听起来就像我可以添加一个语句intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);并使问题消失。那个警告和this thread让这听起来像个坏主意,但我不确定为什么。
答案 0 :(得分:2)
你的onButtonClick有一个小问题。您正在传递getApplicationContext()作为上下文的参考,但实际上您需要将当前活动参考作为上下文传递。
所以只需替换
getApplicationContext()
与
Activity.this (where Activity = Name of your current Activity class)
注意:每当您需要执行任何需要电流的操作时 然后,您必须将当前活动作为上下文传递。例如对于 打开一个新活动需要当前的上下文引用 活性。
答案 1 :(得分:1)
launchGame()
方法不在发布的堆栈跟踪上。问题似乎与View$1.onClick
回调有关。
java.lang.reflect.InvocationTargetException
是使用反射调用方法时发生异常的包装器。尝试抓住InvocationTargetException
中的onClick()
并使用getCause()
查找已包装的例外。
值得一看:What could cause java.lang.reflect.InvocationTargetException?