Как создать постоянную полноэкранную активность наложения в Android
Я хотел бы иметь возможность создавать Activity, который всегда находится на передней панели Android.
Он не должен принимать входные данные, просто передайте его вниз, как показано ниже. Что-то вроде HUD.
Я смог исследовать, что мне нужно установить базовый тип окна в TYPE_SYSTEM_ALERT, но похоже, что Android игнорирует мой код - никакое исключение не выбрасывается, даже если я удалю андроид .permission.SYSTEM_ALERT_WINDOW из манифеста. (требуется использовать этот тип окна). Когда я пытался использовать диалог ALERT в диалоговом окне, он работал нормально, но я не могу сделать диалог в полноэкранном прозрачном объекте.
Вот мой код, возможно, что-то просто отсутствует.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
}
Прозрачный параметр должен быть включен снаружи в манифесте xml, иначе он также не работал.
<item name="android:windowIsTranslucent">true</item>
Ответы
Ответ 1
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null);
getWindow().setAttributes(params);
wm.addView(mTopView, params);
Ответ 2
Я обнаружил, что принятый ответ (tmouse) не совсем сработал у меня. Может быть, он работал на более высоком уровне API? Я использую API-уровень 24.
Этот конкретный ответ рекомендовал:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
);
Проблема с этим. Конструкторы, которые существуют для WindowManager.LayoutParams
, следующие:
![введите описание изображения здесь]()
Поэтому флаг WindowManager.LayoutParams.FLAG_FULLSCREEN
используется как явное значение для int w
и int h
. Это не годится! Размеры вашего вида устанавливаются на 1024 * 1024 - поэтому он не заполняет экран. И даже если вы явно задали ширину и высоту макета в соответствии с размерами устройства: при изменении ориентации экрана они будут не. Нам нужен другой подход...
Я обнаружил, что правильная конструкция для полноэкранного наложения выглядит так:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN,
PixelFormat.TRANSLUCENT
);
Это означает, что мы больше не указываем ширину и высоту. Макет полностью основывается на наших флагах.
Да, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- обязательный флаг; это необходимо, если вы хотите нарисовать декорации, такие как строка состояния.
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
следует использовать вместо TYPE_SYSTEM_ALERT
в уровне API >= 19. Это записка, которую я написал некоторое время назад, к сожалению, мне не удалось найти цитату, чтобы подтвердить, почему я так думал, поэтому возьмите это с щепоткой соли.
Бонусные заметки (если вы читаете это, вы, вероятно, пытаетесь сделать полноэкранный наложение):
Ваш манифест будет нуждаться в этих разрешениях (объяснение здесь):
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Я понимаю, что SYSTEM_ALERT_WINDOW
- это фактическое разрешение, но требуется также ACTION_MANAGE_OVERLAY_PERMISSION
: он позволяет запрашивать во время выполнения, что пользователь предоставляет привилегии SYSTEM_ALERT_WINDOW
.
Я предоставляю здесь исходный код для моего рабочего API уровня 24, создающего полноэкранный накладной.
Ответ 3
Проверьте это
укажите его в файле AndroidManifest.xml
<activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
если вы хотите сделать свою активность полноэкранным и прозрачным.
ознакомьтесь с этим
<activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />