2013-11-21 2 views
1

SpotOnView이라는보기가 있으며 Game_shooting_AB으로 확장됩니다. 다음과 같이 코딩.android : 귀하의 활동이 실행 중입니까? OnFinish에서 표시 할 수없는 대화 상자

배경 :

SpotOnView에는 카운트 다운 타이머가 있습니다. 시간이 끝나면 게임은 끝났고 대화 상자가 팝업되어 사용자가 종료하거나 다시 재생할 것인지 묻습니다.

SpotOnView 번호 :

public class SpotOnView extends View 
{ 
    ...... 
    // constructs a new SpotOnView 
    public SpotOnView(Context context, RelativeLayout parentLayout) 
    { 
     super(context);   
     resources = context.getResources();    
     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ....  

    } 


    public void start_timer() 
    { 
     if (!timerHasStarted) 
     { 
      countDownTimer.start(); 
      timerHasStarted = true; 
     } 
     else 
     { 
      countDownTimer.cancel(); 
      timerHasStarted = false; 
     } 
    } 

    public class MyCountDownTimer extends CountDownTimer 
    { 
     public MyCountDownTimer(long startTime, long interval) 
     { 
      super(startTime, interval); 
     } 

     @Override 
     public void onFinish() 
     { 
      text.setText("Time's up!"); 
       ((Game_shooting_AB)getContext()).replay_dialog(); //LINE 181 
     } 

     @Override 
     public void onTick(long millisUntilFinished) 
     { 
      .... 
     } 
    } 

Game_shooting_AB 번호 :

public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.game_shooting); 

     // create a new SpotOnView and add it to the RelativeLayout 
     RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativeLayout); 
     view = new SpotOnView(this, layout);           //EXTENDING HERE 
     layout.addView(view, 0); // add view to the layout 
    .... 
} 



public void replay_dialog()  
{ 
    final Dialog dialog1 = new Dialog(Game_shooting_AB.this, android.R.style.Theme_Translucent_NoTitleBar); 
    WindowManager.LayoutParams lp = dialog1.getWindow().getAttributes(); 
    lp.dimAmount = 0.7f; 
    dialog1.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 

    Window window = dialog1.getWindow(); 
    window.setGravity(Gravity.CENTER); 

    dialog1.setContentView(R.layout.alert_dialog_replay_shooting); 
    dialog1.setCancelable(false); 
    dialog1.show();  //LINE 431 
    .... 

로그 캣 :

필요한 줄 번호가 위의 코드에서 주석으로 추가했습니다.

11-22 00:16:34.365: W/dalvikvm(1105): threadid=1: thread exiting with uncaught exception (group=0x41f342a0) 
11-22 00:16:34.370: E/AndroidRuntime(1105): FATAL EXCEPTION: main 
11-22 00:16:34.370: E/AndroidRuntime(1105): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:708) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:346) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.view.Window$LocalWindowManager.addView(Window.java:554) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.app.Dialog.show(Dialog.java:277) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at com.app.abc.Game_shooting_AB.replay_dialog(Game_shooting_AB.java:431) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at com.app.abc.SpotOnView$MyCountDownTimer.onFinish(SpotOnView.java:181) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.os.Looper.loop(Looper.java:137) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
11-22 00:16:34.370: E/AndroidRuntime(1105):  at dalvik.system.NativeStart.main(Native Method) 

질문 : 로그 캣은 는 활동을 실행 보여줍니다

?

  1. 나는 대화 상자가 보여줄 기초가 있어야한다는 것을 알고있다. 하지만 어떻게 코드를 수정할 수 있습니까?

  2. Game_shooting_AB 코드로 작성하는 대신 SpotOnView에 대화 상자를 코딩하고 표시 할 수 있습니까?

  3. MyCountDownTimer 클래스와 replay_dialog 클래스를 Game_shooting_AB로 다시 이동하여 코드를 수정하려고했지만 동일한 오류가 여전히 발생합니다. MyCountDownTimer의 OnFinish가 대화 상자가 표시 할 기본 항목을 찾을 수 없도록 Activity를 완료할지 여부를 묻고 싶습니다.

감사합니다.

답변

1

문제는 "((Game_shooting_AB) getContext()). replay_dialog();"에서 시작되었습니다. 이 코드 라인.

안쪽에서 getContext()를 호출하면 안드로이드의 설명서에서 "뷰의 컨텍스트"를 얻을 수 있습니다. 이제 당신이하고있는 것은 Game_shooting_AB에 컨텍스트를 캐스팅하는 것입니다.이 컨텍스트는 Activity의 컨텍스트가 아니거나 아닐 수도 있기 때문에 좋지 않습니다. 체크 아웃 Romain Guy's answer. 따라서 안드로이드는 "당신의 활동은 실행 중입니까?"라고 말하고 있습니다.

이제는 현재 문제를 해결하기 위해 공용 인스턴스를 통해 활동 인스턴스를이 뷰에 전달하고 로컬 변수에 저장할 수 있습니다.

은 다음과 같이 코드를 조정합니다

public class SpotOnView extends View 
{ 
    Game_shooting_AB mGame_shooting_AB; 
    public void setGame_shooting_AB(Game_shooting_AB mGame_shooting_AB){ 
    this.mGame_shooting_AB = mGame_shooting_AB; 
    } 
    ...... 
    // constructs a new SpotOnView 
    public SpotOnView(Context context, RelativeLayout parentLayout) 
    { 
    super(context);   
    resources = context.getResources();    
    layoutInflater = (LayoutInflater)   context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ....  

    } 


    public void start_timer() 
    { 
    if (!timerHasStarted) 
    { 
     countDownTimer.start(); 
     timerHasStarted = true; 
    } 
    else 
    { 
     countDownTimer.cancel(); 
     timerHasStarted = false; 
    } 
    } 

public class MyCountDownTimer extends CountDownTimer 
{ 
    public MyCountDownTimer(long startTime, long interval) 
    { 
     super(startTime, interval); 
    } 

    @Override 
    public void onFinish() 
    { 
     text.setText("Time's up!"); 
      mGame_shooting_AB.replay_dialog(); //LINE 181 
    } 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 
     .... 
    } 
} 

당신이 SpotOnView의 인스턴스가 활동 설정 얻을 후 :이 도움이

 view = new SpotOnView(this, layout);           //EXTENDING HERE 
    layout.addView(view, 0); // add view to the layout 
    view.setGame_shooting_AB(Game_shooting_AB.this); 

희망을.

+0

신속한 답변을 보내 주셔서 감사합니다! 나는'setGame_shooting_AB'을 부를 곳을 물어보고 싶습니다. 이제 java.lang.NullPointerException이 표시됩니다. – pearmak

+0

SpotOnView 클래스에 setGame_shooting_AB 메소드를 추가해야합니다. SpotOnView의 인스턴스를 가져온 후 매개 변수로 액티비티를 전달하여이 메소드를 호출하십시오. – saiful103a

+0

끔찍하게 죄송합니다. 여전히 위장되어 있습니다 ... 위의 코딩에 대해 자세히 설명해 주시겠습니까? = (계속해서 NPE를 계속 사용하고 있습니다 ... – pearmak

0

활동을 완료하는 동안 인 텐트에서 setResult을 사용해야합니다. 이 결과는 부모 작업에서 onActivityResult으로 처리 한 다음 대화 상자가 표시되어야합니다.

+0

나는 지금 코드를 수정했고 클래스'MyCountDownTimer'와 메소드'replay_dialog'를'Game_shooting_AB'으로 되돌려 놓았지만 같은 오류가 여전히 나옵니다. MyCountDownTimer의 'OnFinish'가 대화 상자가 보여 질베이스를 찾을 수 없도록 Activity를 끝내는 지 여부를 묻고 싶습니다. – pearmak