我遇到创建弹出窗口的问题。我有一个正在开发的游戏,我试图在赢得游戏后弹出一个窗口或子菜单,以便用户可以选择退出或重新启动。我在弹出窗口中看到的所有内容都在活动中完成。我想从我的“控制器”类中做到这一点,基本上我想查看用户是否在我的逻辑课程中获胜,如果他们确实打开了一个窗口,我有一种感觉,我将不得不这样做这在我的活动中。任何帮助将不胜感激。如果您需要任何进一步的细节,请告诉我。
答案 0 :(得分:2)
您必须在活动中执行此操作。您有两种选择:
1)当你知道游戏结束时,在你的“控制器”类中有一个方法,它返回是否应该显示弹出窗口。像isGameWon()这样的东西。从您的活动中调用此信息并做出相应的响应。
2)在控制器类中保留对Activity的引用,或允许以单例对象的形式访问Activity。当游戏结束时,检查玩家是否在控制器类中获胜,如果是,则调用Activity中的函数以显示弹出窗口,如showGameWonPopup()。
您无法在UI活动之外显示弹出窗口。您的两个班级需要就游戏的最终结果进行沟通并做出相应的回应。
答案 1 :(得分:0)
您实际上可以显示自定义非活动类的弹出窗口。我是从一个自定义类中创建的,该类被设置为活动中按钮的onTouchListener。在这种情况下,关键是从活动中获取传递给onTouch方法的视图的父级。我认为您可以通过向构造函数传递基础活动(或您在该活动中用于setContentView()的布局)来访问任意类的弹出容器视图。
public class CustomListener implements View.OnTouchListener{
public PopupWindow mPopup;
public TalkButtonListener(Context ctx) {
LayoutInflater inflater = (LayoutInflater)
ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE);
mPopup = new PopupWindow(
inflater.inflate(R.layout.popup_layout, null, false),
100,100,true);
}
public boolean onTouch (View v, MotionEvent event){
View v2 = (View) v.getParent();
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mPopup.showAtLocation(v2, Gravity.CENTER, 0, 0);
return(false);
case MotionEvent.ACTION_UP:
mPopup.dismiss();
return(false);
default:
return(false);
}
}
}
感谢Todd关于显示弹出窗口的代码(here)。