gpt4 book ai didi

机器人:你的 Activity 在运行吗? OnFinish 时无法显示对话框

转载 作者:行者123 更新时间:2023-11-30 03:16:00 26 4
gpt4 key购买 nike

我有一个名为 SpotOnView 的 View ,它正在 Game_shooting_AB 上扩展。编码如下。

背景:

在 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 android.os.BinderProxy@43304558 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)

问题:

logcat 显示 你的 Activity 在运行吗?

  1. 我知道对话框需要有基础才能显示。但是如何修改代码呢?

  2. 是否可以在 SpotOnView 中编码并显示对话框,而不是在 Game_shooting_AB 代码中编写?

  3. 我尝试通过将类 MyCountDownTimer 和方法 replay_dialog 移回 Game_shooting_AB 来修改代码,但仍然出现相同的错误。请问 MyCountDownTimer 的 OnFinish 是否会导致 Activity 结束,以至于对话框无法找到要显示的基数?

非常感谢!!

最佳答案

问题从“((Game_shooting_AB)getContext()).replay_dialog();”开始这行代码。

当您从 View 内部调用 getContext() 时,您会从 android 文档中找到,您会得到“ View 的上下文”。现在您正在做的是将该上下文转换为 Game_shooting_AB,这并不好,因为它可能是也可能不是 Activity 的上下文。结帐Romain Guy's answer对这个。因此 android 会告诉您“您的 Activity 正在运行吗?”。

现在要解决您当前的问题,您可以通过任何公共(public)方法将您的 Activity 实例传递给此 View ,并将其存储在局部变量中。

像这样调整你的代码:

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 实例后设置 Activity :

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

希望这对您有所帮助。

关于机器人:你的 Activity 在运行吗? OnFinish 时无法显示对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com