web-dev-qa-db-fra.com

Comment ajouter une vue flottante au gestionnaire de fenêtres Android et écouter les événements du bouton Précédent du système/matériel

J'ai un service qui affiche une vue flottante sur le gestionnaire de fenêtres (avec l'autorisation WINDOW_TYPE_ALERT). Je suis capable de l'afficher et d'effectuer des actions. Mais j'ai deux questions spécifiques:

  1. Concernant la mise en oeuvre de la vue flottante
  2. Comment écouter un événement du bouton Précédent du système afin que je puisse rejeter la vue.

La mise en oeuvre:

Dans le manifeste, j'ai ajouté des autorisations pour:

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />

J'ai un récepteur de diffusion qui écoutera les événements d'alarme. À la réception de l'événement, je démarre un service pour afficher la vue flottante. Voici le code que j'utilise pour créer la vue.

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

Chaque fois qu'un utilisateur exécute une action sur la vue, je supprime la vue du gestionnaire de fenêtres et supprime le service.

Ce que j'aimerais savoir, c’est: s’il s’agit de la bonne façon d’aborder le problème ou s’il existe de meilleures façons de le faire? Et dois-je apporter des modifications aux LayoutParams ou les conserver tels quels?

Deuxièmement, je voudrais également supprimer cette vue flottante lorsque le bouton SYSTEM BACK/HARDWARE BACK est enfoncé. Toute indication sur la façon de procéder serait utile.

Joindre une capture d'écran de la vue flottante pour une meilleure compréhension:

Floating View

11
Handroid

En ce qui concerne la détection du bouton Précédent - je l’ai fait fonctionner de la manière suivante (tout se passe dans le service onCreate code):

  1. Enveloppez votre vue souhaitée dans ViewGroup (LinearLayout, Relative ou autre)
  2. remplacez dispatchKeyEvent comme ceci dans la vue wrapper:
mView = new RelativeLayout(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
                // < your action >
                return true;
            }
            return super.dispatchKeyEvent(event);
        }
};
  1. ajoutez la vue wrapper au gestionnaire de fenêtres et assurez-vous que WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE n'est pas défini sur les paramètres de disposition du wrapper.
11
qbasso

Jetez un coup d'œil à Standout Library, qui est bon pour la gestion des fenêtres flottantes. Il semble également que l'événement ne soit pas géré par le passé. Contacter le développeur peut aider.

Et une autre façon est d’essayer d’ouvrir une activité avec un fond/thème semi-transparent pour obtenir l’effet similaire utilisé dans une fenêtre flottante dans Any.do et l’événement backpress peut être géré

6
Balaji

Concernant le bouton Précédent - Vous devez remplacer le "onBackPressed ()" dans votre vue et faire ce que vous voulez.

@Override
public boolean onBackPressed() {
    // Remove your view from the window...
}

Quoi qu'il en soit, j'utilise un SDK appelé Tooleap , pour afficher les fenêtres flottantes de manière simple.

2
devdev

Voulez-vous que le bouton ACCUEIL supprime également votre interface utilisateur? Dans ce cas, il semble préférable d’organiser une activité ouverte sur un arrière-plan transparent plutôt que sur une fenêtre d’alerte. Pour ce faire, utilisez le style suivant comme thème de votre activité

<style name="Transparent">
    <item name="Android:windowFrame">@null</item>
    <item name="Android:windowBackground">@color/transparent</item>
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
    <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="Android:windowFullscreen">true</item>
</style>
1
yoah