Питання стосувалось 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/