У меня проблема с созданием всплывающего окна. У меня есть игра, которую я разрабатываю, и я пытаюсь открыть окно или подменю после того, как я выиграю игру, чтобы у пользователя была возможность выйти или перезапустить. Все, что я видел во всплывающих окнах, сделано в процессе. Я хочу сделать это из моего класса "контроллера", в основном я хочу проверить, выиграл ли пользователь в моем классе логики, и если они действительно открыли окно, у меня есть чувство, что мне придется сделать это в моей деятельности. Любая помощь будет оценена по достоинству. Если вам нужна дополнительная информация, просто дайте мне знать.
Как работает всплывающее окно на Android, если оно требуется в классе, отличном от Activity?
Ответы (2)
Вам нужно будет сделать это в Activity. У вас есть два варианта:
1) Когда вы знаете, что игра окончена, имейте в своем классе «контроллер» метод, который возвращает, должно ли отображаться всплывающее окно. Что-то вроде isGameWon (). Вызовите это из своей деятельности и ответьте соответствующим образом.
2) Сохраните ссылку на вашу Activity в своем классе контроллера или разрешите доступ к вашей Activity как к одноэлементному объекту. Когда игра закончится, проверьте, выиграл ли игрок в вашем классе контроллера, и если да, вызовите функцию в вашей Activity для отображения всплывающего окна, например showGameWonPopup ().
Вы не можете отображать всплывающее окно за пределами действия пользовательского интерфейса. Два ваших класса должны сообщить о конечном результате игры и отреагировать соответствующим образом.
Фактически вы можете показать всплывающее окно из настраиваемого класса бездействия. Я делаю это из специального класса, который установлен как 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);
}
}
}
Спасибо Тодду за код для отображения всплывающего окна (здесь).