Как работает всплывающее окно на Android, если оно требуется в классе, отличном от Activity?

У меня проблема с созданием всплывающего окна. У меня есть игра, которую я разрабатываю, и я пытаюсь открыть окно или подменю после того, как я выиграю игру, чтобы у пользователя была возможность выйти или перезапустить. Все, что я видел во всплывающих окнах, сделано в процессе. Я хочу сделать это из моего класса "контроллера", в основном я хочу проверить, выиграл ли пользователь в моем классе логики, и если они действительно открыли окно, у меня есть чувство, что мне придется сделать это в моей деятельности. Любая помощь будет оценена по достоинству. Если вам нужна дополнительная информация, просто дайте мне знать.


person John Barton    schedule 24.03.2011    source источник


Ответы (2)


Вам нужно будет сделать это в Activity. У вас есть два варианта:

1) Когда вы знаете, что игра окончена, имейте в своем классе «контроллер» метод, который возвращает, должно ли отображаться всплывающее окно. Что-то вроде isGameWon (). Вызовите это из своей деятельности и ответьте соответствующим образом.

2) Сохраните ссылку на вашу Activity в своем классе контроллера или разрешите доступ к вашей Activity как к одноэлементному объекту. Когда игра закончится, проверьте, выиграл ли игрок в вашем классе контроллера, и если да, вызовите функцию в вашей Activity для отображения всплывающего окна, например showGameWonPopup ().

Вы не можете отображать всплывающее окно за пределами действия пользовательского интерфейса. Два ваших класса должны сообщить о конечном результате игры и отреагировать соответствующим образом.

person LeffelMania    schedule 24.03.2011
comment
Ах, да, я действительно планировал использовать ваш первый вариант, просто хотел посмотреть, смогу ли я просто сделать это прямо из класса, не относящегося к деятельности. Спасибо. - person John Barton; 24.03.2011

Фактически вы можете показать всплывающее окно из настраиваемого класса бездействия. Я делаю это из специального класса, который установлен как 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);
        }
    }
}

Спасибо Тодду за код для отображения всплывающего окна (здесь).

person pvans    schedule 04.01.2012