37 votes

Détecter l'État de Visibilité de la Barre / TYPE_SYSTEM_OVERLAY pas de redimensionnement automatiquement

Je suis l'aide de la bien connue" TYPE_SYSTEM_OVERLAY méthode pour créer un plein écran de superposition qui est toujours au-dessus des autres points de vue.

Sur un Moto Atrix2 API15 et pour chaque AVD de API 10 par 17 de la superposition de vue redimensionne automatiquement (s'étend verticalement) lorsque la barre d'état est cachée par une autre application. La superposition semble "stay on top" de tous les autres points de vue, car je pense qu'il devrait. Lorsque la barre d'état est dans la vue de nouveau, la superposition abaisse automatiquement la taille de nouveau (moins de pixels verticaux, essentiellement en soustrayant la hauteur de la barre d'état).

C'est le comportement souhaité et je suis enclin à penser que ce n'est pas une exception ou imparfaites comportement due à travailler sur de nombreux différents émulateurs ainsi que d'au moins un fabricant de l'appareil (motorola), peut-être plus, mais je n'ai pas accès à l' addtl devices.

Le problème: Sur un Samsung GS2 (API15) & aussi testé sur Kindle Fire (API10?), la superposition à ne pas redimensionner automatiquement (remplir l'espace où la barre d'état une fois a) lorsque la barre d'état est cachée par une autre application (barre d'état derrière en plein écran app). Sur ces appareils, après la vue est créée la première fois que je ne pas faire plus d'événements à partir d'un onSizeChanged remplacement pour la vue.

Voici le code:

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 a la onSizeChanged remplacer.

J'ai joué avec à peu près tous windowmanager layoutparam je peux trouver, y compris SYSTEM_ALERT, FLAG_LAYOUT_IN_SCREEN, etc. Je ne vais pas dormir jusqu'à ce que je peux comprendre cela!

Edit 11/30/12: j'ai trouvé ce de @déviants: http://stackoverflow.com/a/9195733/1851478 qui est essentiellement ce que je fais, cependant, le problème reste le même avec certains appareils ne pas le redimensionnement de la system_overlay automatiquement. Peut-être que je devrait soulever un bug.

Plus d'INFOS: SI je force un redraw (ou même juste de la charge de la superposition de l'application) alors qu'il existe plein écran de l'application en haut de l'arbre d'affichage, mon superposition encore ne tire pas sur l'espace dans la barre d'état prend normalement jusqu' (même si la barre d'état n'est pas en vue à l'époque de tirage), il semble donc que si le recouvrement n'est pas "superposées" en haut de la fenêtre au premier plan qui est en plein écran (et j'ai à la fois créé et testé de nombreuses applications plein écran en utilisant une variété de méthodes pour les faire passer en plein écran). Sur ces appareils, la seule façon d'obtenir la superposition de tirer sur la barre d'état (même si la barre d'état n'est pas en vue) est d'utiliser le drapeau FLAG_LAYOUT_IN_SCREEN, mais alors la taille de la mise en page ne change jamais, est toujours en plein écran, et donc à l'origine du problème pourquoi cela fonctionne sur certains appareils, mais pas d'autres.

Edit 12/12/12: Donc je n'ai pas plus de chance sur ce point, et je l'ai fait essayer à l'aide de getLocalVisibleRect sur les points de vue, mais malheureusement depuis mon application ne possède pas le SystemUI points de vue il ne peut pas détecter ce qui est au-dessous de ces couches. Je suppose qu'avec une ROM custom, je pourrais faire cela, mais j'ai besoin d'une solution sans racine.

Je ne vois d'autres applications sur le marché sont d'avoir le même problème de la détection de la barre d'état sur la non-travail des téléphones que j'ai énumérés ci-dessus. Exemple: refroidir l'outil, l'oméga de la barre d'état & barre d'état +. Bounty soulevées.

Edit 12/19/12 Photos ajoutées. Notez que sur un dispositif de la zone grise aussi "couvre" la zone noire (n'importe quelle application qui est actuellement en plein écran), la zone noire couvre la totalité de l'écran, je suis juste montrer que la zone grise que mon superposition, même si elle est aussi en plein écran (moins ou plus de la hauteur de la barre d'état en fonction de travail/non-travail de l'appareil et si c'est en vue ou pas).

enter image description hereenter image description here

3voto

pvyParts Points 191

J'espère que je comprends ce que vous êtes après, ici, mais, dans mon application (ÉQUIPE BatteryBar) j'ai eu un problème similaire. ( pas de racine autorisations minimales )

Je ne pouvais pas détecter un plein écran sur rien en dessous API11 (et intermittentes sur certaines (Samsung pour la plupart) des dispositifs ci-dessus API11). J'ai donc fait un écouteur personnalisé en ajoutant un second schéma de la WindowManager avec une mise en page différente param ensuite annulé la onLayout pour vérifier si la barre est toujours là ou pas, par la vérification de la taille de la fenêtre. à partir de là, vous pouvez faire ce que jamais vous avez besoin pour votre vue principale.

J'allais ranger, mais cela a fonctionné donc je n'ai pas :P code est de plus d'un an et à partir de quand j'ai commencé à coder pour android donc oui. De la nourriture pour la pensée tho. espérons que cela aide.

voici le code dans une pension à mon github avec un copier coller tout droit sorti de mon application sur la façon dont je l'utilise. petit extrait ici

wm.addView(sizeLayout, params);// add your view

// then add the next one
Screendetect mDetector;
mDetector = new Screendetect(this);
mDetector.setOnFullScreenListener(new OnFullScreenListener() {
            @Override
            public void fsChanged(boolean FS_Bool) {
                // TODO rethink this to be better.... bit hacky...
                if (FS_Bool) {
                    Log.d("battbardetect", "Statusbar hidden");
                    FS_vissible(); // do what ever you need to
                } else if (!FS_Bool) {
                    Log.d("battbardetect", "Statusbar Vissible"); 
                    FS_hidden(); // do what ever you need to
                }
            }
        });
wm.addView(mDetector, params);

1voto

Chuk Diesel Points 574

Je pense que cela peut être le même problème avec le masquage de la barre de titre sur les fenêtres de dialogue où le système définit la visibilité de caché à la place du disparu. Cela provoque la boîte de dialogue de la fenêtre d'obtenir de manière incorrecte centré.

Pour cela, voici comment je le réparer. Cela pourrait fonctionner pour votre situation, mais vous devrez peut-être ajuster pour le nom de la barre d'état de l'identificateur.

Window window = dialog.getWindow();
View view = window.getDecorView();
int topPanelId = getResources().getIdentifier("topPanel", "id", "android");
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
topPanel.setVisibility(View.GONE);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X