Sto utilizzando il noto metodo TYPE_SYSTEM_OVERLAY
per creare una sovrapposizione a schermo intero che è sempre in primo piano rispetto ad altre viste.Rileva visibilità barra di stato/TYPE_SYSTEM_OVERLAY non ridimensionamento automatico
Su Moto Atrix2 API15
e per ogni AVD
da API 10
attraverso 17
vista sovrapposizione ridimensiona automaticamente (espande verticalmente) quando la barra di stato è nascosta da un'altra applicazione. L'overlay sembra "stare in cima" a tutte le altre visualizzazioni, come penso che dovrebbe. Quando la barra di stato è di nuovo visualizzata, l'overlay riduce automaticamente le sue dimensioni (meno pixel verticali, sottraendo sostanzialmente l'altezza della barra di stato).
Questo è il comportamento desiderato e sono propenso a pensare che questo non è l'eccezione o il comportamento difettoso a causa di essa a lavorare su molti emulatori differenti così come almeno un produttore del dispositivo (Motorola), forse più, ma io don 't hanno accesso a addtl devices.
il problema: su una Samsung GS2 (API15)
& testato anche sul Kindle Fire (API10?)
, la sovrapposizione non ridimensiona automaticamente (riempire lo spazio in cui la barra di stato era una volta) quando la barra di stato è nascosta da un'altra applicazione (barra di stato dietro l'app a schermo intero). Su questi dispositivi, dopo che la vista è stata creata la prima volta non ottengo altri eventi da una sovrascrittura onSizeChanged per la vista.
Ecco il codice pertinente:
params = new WindowManager.LayoutParams(
1, WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSPARENT);
wm.addView(sizeLayout, params);
sizeLayout ha l'override onSizeChanged.
Ho suonato in giro con quasi ogni windowmanager
layoutparam
Posso trovare, incluso SYSTEM_ALERT, FLAG_LAYOUT_IN_SCREEN, ecc. Non dormirò fino a quando non riesco a capirlo!
Edit 11/30/12: Ho trovato questo da @deviant: https://stackoverflow.com/a/9195733/1851478 che è fondamentalmente quello che sto facendo, ma il problema rimane con alcuni dispositivi non ridimensionando automaticamente lo system_overlay. Forse dovrei sollevare un bug.
Ulteriori informazioni: SE forzare un ridisegno (o anche solo caricare l'app overlay) mentre è presente un'app a schermo intero nella parte superiore dell'albero della vista, la mia sovrapposizione continua a non disegnare nello spazio utilizzato normalmente dalla barra di stato up (anche se la barra di stato non è visibile al momento del sorteggio), quindi sembra che l'overlay non sia "sovrapposto" in cima alla finestra in primo piano che è a schermo intero (e ho creato e testato molti app a schermo intero che utilizzano una varietà di metodi per farli andare a schermo intero). Su questi dispositivi, l'unico modo per ottenere l'overlay per disegnare sulla barra di stato (anche se la barra di stato non è visibile) è usare la bandiera FLAG_LAYOUT_IN_SCREEN
, ma la dimensione del layout non cambia mai, è sempre a schermo intero, e quindi di nuovo al problema originale perché funziona su alcuni dispositivi ma non su altri.
Modifica 12/12/12: Quindi non ho avuto ulteriori fortuna su questo, e ho fatto provare a utilizzare getLocalVisibleRect sulle viste, ma purtroppo da quando la mia app non possiede lo SystemUI lo vede posso rileviamo cosa c'è sotto le sovrapposizioni. Suppongo che con una ROM personalizzata potrei farlo, ma ho bisogno di una soluzione senza root.
Vedo che altre app sul mercato hanno lo stesso problema nel rilevare la barra di stato sui telefoni non funzionanti che ho elencato sopra. Esempio: cool tool, omega statusbar barra di stato & +. Bounty sollevata.
Modifica 12/19/12 Immagini aggiunte. Nota che su un dispositivo funzionante l'area grigia "copre" anche l'area nera (qualsiasi app che è attualmente a schermo intero), l'area nera copre effettivamente l'intero schermo, sto solo mostrando l'area grigia come il mio overlay anche se è anche schermo intero (meno o più l'altezza della barra di stato a seconda del dispositivo funzionante/non funzionante e se è visibile o meno).
puoi aggiungere screenshot del comportamento necessario e cosa ottieni? –
@Anis foto aggiunte. – logray
hai provato a girare a schermo intero? prima di aggiungere la tua vista prova: // vai a schermo intero WindowManager.LayoutParams attrs = mActivity.getWindow(). getAttributes(); attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow(). SetAttributes (attrs); –