Питання стосувалось Popupwindowкласу, але всі давали відповіді, які використовують Dialogклас. Це майже марно, якщо вам потрібно використовувати Popupwindowклас, оскільки Popupwindowне має getWindow()методу.
Я знайшов рішення, яке насправді працює Popupwindow. Потрібно лише, щоб кореневим файлом xml, який ви використовуєте для фонової діяльності, було FrameLayout. Ви можете дати Framelayoutелементу android:foregroundтег. Що робить цей тег, це вказати ресурс, який можна малювати, який буде накладений поверх усієї діяльності (тобто, якщо Framelayout є кореневим елементом у файлі xml). Потім ви можете контролювати непрозорість ( setAlpha()) переднього плану, що малюється.
Ви можете використовувати будь-який вподобаний ресурс для малювання, але якщо вам просто потрібен ефект затемнення, створіть файл xml у папці, що малюється, з <shape>тегом як кореневий.
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#000000" />
</shape>
(Див. Http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape для отримання додаткової інформації про shapeелемент). Зверніть увагу, що в кольоровому тегу я не вказав альфа-значення, яке робило б елемент, що малюється, прозорим (наприклад #ff000000). Причиною цього є те, що будь-яке жорстко закодоване значення альфа, здається, замінює будь-які нові значення альфа, які ми встановлюємо за допомогою setAlpha()в нашому коді, тому ми цього не хочемо. Однак це означає, що предмет, що малюється, спочатку буде непрозорим (суцільним, непрозорим). Тож нам потрібно зробити його прозорим у onCreate()методі діяльності.
Ось код елемента Framelayout xml:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainmenu"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:foreground="@drawable/shape_window_dim" >
...
... your activity's content
...
</FrameLayout>
Ось метод onCreate () Activity:
public void onCreate( Bundle savedInstanceState)
{
super.onCreate( savedInstanceState);
setContentView( R.layout.activity_mainmenu);
layout_MainMenu = (FrameLayout) findViewById( R.id.mainmenu);
layout_MainMenu.getForeground().setAlpha( 0);
}
Нарешті, код для затемнення активності:
layout_MainMenu.getForeground().setAlpha( 220);
layout_MainMenu.getForeground().setAlpha( 0);
Значення альфа переходять від 0(непрозорий) до 255(невидимий). Вам слід розмити активність, коли ви закриваєте спливаюче вікно.
Я не включив код для показу та відхилення спливаючого вікна, але ось посилання на те, як це можна зробити: http://www.mobilemancer.com/2011/01/08/popup-window-in-android/