2016-09-24 9 views
1

Androidアプリをオブジェクト指向にして、特定のタイプの入力から呼び出すアクティビティを選択するクラス(DigitHandler)を作成しようとしています。 DigitHandlerは、ユーザーがInputCodeActivityと呼ばれる別のクラスのボタンをクリックすると呼び出されます。Androidのアクティビティを開始するとIllegalStateException/InvocationTargetExceptionが発生する

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

私は間違って何をしていますか?

EDIT:コンテキストgetApplicationContext(である)、このようになり、現在の活動にokButtonClick()メソッドから渡された:DigitHandlerのコンストラクタにctxをなるコンテキスト(探し

public void okButtonClick(View view) 
{ 
    theNumber = numberPad.getText().toString(); 
    Log.e("Recording the number", "Number is"+theNumber); 
    DigitHandler dh = new DigitHandler(getApplicationContext(), theNumber); 
} 

DigitHandlerはlaunchGame()に渡されます)と文字列theNumberが渡されます。

EDIT:try-catchブロックを使用して、InvocationTarget内で実際の例外が見つかりました: "アクティビティコンテキスト外からstartActivity()を呼び出すには、FLAG_ACTIVITY_NEW_TASKフラグが必要です。

だからと発音しますが、私は単に文intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)を追加することができます。問題を解決してください。その警告とthis threadはそのようなサウンドを悪い考え方にしていますが、その理由を正確には分かりません。

+0

このクラスのコンテキスト変数の参照をどのように渡しますか。アクティビティー・インスタンス参照でなければなりません。コンテキスト・リファレンスをアクティビティー・クラスから渡す方法を教えてください。 – EEJ

+0

コンテキストとは何ですか?また、あなたの新しい活動のためのコードは何ですか?新しいアクティビティを開いているときに例外が発生しているようです – amiekuser

答えて

2

あなたonButtonClickの小さな問題があります。 getApplicationContext()をコンテキストの参照として渡していますが、実際には現在のアクティビティ参照をここでコンテキストとして渡す必要があります。

だから

Activity.this (where Activity = Name of your current Activity class) 

注意して

getApplicationContext() 

を交換する:あなたが現在 コンテキストを必要とする操作を実行する必要があるときはいつでも、あなたがコンテックスとして現在のアクティビティを渡す必要があります。例えば の新しいアクティビティを開くには現在のコンテキスト参照が必要です アクティビティ。

1

launchGame()のメソッドはスタックトレースにありません。この問題は、View$1.onClickコールバックの問題です。

java.lang.reflect.InvocationTargetExceptionは、リフレクションでメソッドを呼び出す際に発生した例外のラッパーです。 InvocationTargetExceptiononClick()にキャッチし、getCause()を使用してラップされた例外を調べてください。

の価値を見て:What could cause java.lang.reflect.InvocationTargetException?

+1

これは実際の例外を見つけるのに役立ちました: –

関連する問題