Можно ли отобразить PopupWindow из другого PopupWindow? - PullRequest
4 голосов
/ 09 июня 2011

В приложении Honeycomb я в нескольких местах использую собственный подкласс PopupWindow для отображения различных представлений. Все это прекрасно работает, пока одно из этих представлений не попытается отобразить другое PopupWindow.

Например, Spinner и AutoCompleteTextView оба используют PopupWindow для отображения связанных списков вариантов. Если вы поместите один из них в представление PopupWindow и нажмете, чтобы активировать виджет, WindowManager предупредит вас через LogCat:

WARN/WindowManager(111): Attempted to add window with token that is a sub-window: android.os.BinderProxy@40ea6880. Aborting.

И затем он выдаст WindowManager$BadTokenException, когда попытается показать это всплывающее окно.

Представление для пользовательского PopupWindow раздувается с использованием LayoutInflater, полученного из контекста привязанного представления. Я видел другие вопросы, предполагающие, что BadTokenExceptions могут возникать при использовании неподходящего контекста для получения LayoutInflater, но не похоже, что в этом случае есть другая опция.

Предупреждение журнала от WindowManager указывает на то, что это неподдерживаемый случай. Кто-нибудь может подтвердить это или предоставить палку, чтобы толкнуть меня в правильном направлении?

Вот ссылка на код (в любом случае его версия), из которого происходит ошибка: WindowManagerService.java

1 Ответ

0 голосов
/ 26 февраля 2014

наверняка вы можете отобразить PopupWindow из другого PopupWindow , просто создайте новую переменную окна pop_up и накачайте новый макет PopupWindow в новом представлении , как в следующем примере:

public PopupWindow pw;
public PopupWindow new_pw;
public View pw_layout = null;
public View new_pw_layout = null;

public void initiatePopupWindow() throws Exception{
// to get the instance of the LayoutInflater
        LayoutInflater inflater = (LayoutInflater) YourCurrentActivityClass.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

pw_layout = inflater.inflate(R.layout.first_popup_xml,
                    (ViewGroup)findViewById(R.id.first_popup_main_layout));

// create a 300px width and 470px height PopupWindow
pw = new PopupWindow(pw_layout,
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT, true);
// display the popup in the center
pw.showAtLocation(pw_layout, Gravity.CENTER, 0, 0);

Button item_button = (Button) pw_layout.findViewById(R.id.item);
                item_button .setOnClickListener(onItemlClick);

}


// the onClick listener for the item button
public OnClickListener onItemlClick = new OnClickListener() {
        public void onClick(View v) {

if(v == item_button){
LayoutInflater inflater = (LayoutInflater) YourCurrentActivityClass.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
new_pw_layout = inflater.inflate(R.layout.second_popup_xml,
                    (ViewGroup)findViewById(R.id.second_popup_main_layout));
// create a 300px width and 470px height new PopupWindow
new_pw = new PopupWindow(new_pw_layout,
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
// display the new popup in the center
new_pw.showAtLocation(new_pw_layout, Gravity.CENTER, 0, 0);// you can set it's position here([0,0] means in the exact center it's like [go 0 pixels from the center to the right , go 0 pixels from the center down])

}
}
};
...