如果在非Activity类中需要,Android上的弹出窗口如何工作?

时间:2011-03-24 15:58:55

标签: android android-activity popupwindow

我遇到创建弹出窗口的问题。我有一个正在开发的游戏,我试图在赢得游戏后弹出一个窗口或子菜单,以便用户可以选择退出或重新启动。我在弹出窗口中看到的所有内容都在活动中完成。我想从我的“控制器”类中做到这一点,基本上我想查看用户是否在我的逻辑课程中获胜,如果他们确实打开了一个窗口,我有一种感觉,我将不得不这样做这在我的活动中。任何帮助将不胜感激。如果您需要任何进一步的细节,请告诉我。

2 个答案:

答案 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)。