2012-04-10 2 views
17

Я хотел бы иметь возможность создавать активность, которая всегда находится на передней панели Android. Он не должен принимать входные данные, просто передайте его вниз, к тому, что ниже под ним. Что-то вроде HUD.Как создать на весь экран полноэкранный режим наложения в Android

Я смог исследовать, что мне нужно установить основной тип окна 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> 

ответ

23
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); 
+0

Что ваш метод onCreate в итоге выглядит? Я пытаюсь проверить это сам сейчас. – Rell3oT

+3

ViewGroup mTopView = (ViewGroup) App.inflater.inflate (R.layout.main, null); @tmouse Что такое APP здесь? – rana

+1

@tmouse Что такое R.layout.main? это план действий? или прозрачный вид наполнителя? – Premier

0

Заканчивать этот

упоминает его в вашем файле 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" /> 
+0

Спасибо, но то, что достигнуто выше, только активирует активность как полноэкранный/прозрачный. То, что я пытаюсь сделать, - сделать работу ВСЕГДА сверху, независимо от того, что делает пользователь (запуск других приложений, блокировка телефона и т. Д.). – tmouse

+0

Вы использовали '' в файле манифеста, если не проверить это – Ravi1187342

+0

Да, как я уже писал, я использовал это, но как указано выше, это разрешение никогда не используется (что неверно - для появления такого окна требуется разрешение). – tmouse

1

Я обнаружил, что the accepted answer (by 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 следующим образом:

enter image description here

Так 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 - обязательный флаг; это необходимо, если вы хотите нарисовать украшения, такие как строка состояния.

TYPE_SYSTEM_ALERT следует использовать вместо уровня TYPE_SYSTEM_ALERT в уровне API> = 19. Это записка, которую я написал некоторое время назад, к сожалению, мне не удалось найти цитату, чтобы подтвердить, почему я так думал, поэтому возьмите это с щепоткой соли.


Бонусные ноты (если вы читаете это, вы, вероятно, пытается сделать накладку полноэкранный):

Ваш манифест потребуются эти разрешения (объяснение here):

<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 привилегии.

Я предоставляю here исходный код моего рабочего API уровня 24, который создает полноэкранный накладной.

Смежные вопросы