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

3
我在创建弹出窗口时遇到了问题。我正在开发一个游戏,想在用户赢得游戏后弹出一个窗口或子菜单,以便用户可以选择退出或重新开始。我看到的所有弹出窗口都是在活动中完成的。我想从我的“控制器”类中完成这个操作,基本上我想检查用户是否在我的逻辑类中获胜,如果他们获胜了,就会弹出一个窗口。我有一种感觉,我需要在我的活动中完成这个操作。如果需要更多详细信息,请告诉我。
2个回答

2

您需要在Activity中完成此操作,有两个选项:

1)当您知道游戏结束时,请在“controller”类中编写一个方法来返回是否应该显示弹出窗口,例如isGameWon()。从Activity中调用它并进行相应的响应。

2)在控制器类中保留对Activity的引用,或允许以单例对象的方式访问Activity。当游戏结束时,在控制器类中检查玩家是否获胜,如果是,则在Activity中调用函数来显示弹出窗口,例如showGameWonPopup()。

您无法在UI Activity之外显示弹出窗口。您的两个类需要就游戏结果进行通信,并做出相应的响应。


啊,是的,我本来就计划采用你的第一种选项,只是想看看能否直接从非Activity类中完成。谢谢。 - John Barton

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提供的显示弹出窗口代码(这里)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接