12
votes

Comment gérer le toucher à l'extérieur de la vue dans Android?


5 commentaires

"Il n'a aucune fonctionnalité de la barre de renvoi en touchant l'écran en dehors de la barre". Pouvez-vous expliquer ce qu'est un "bar"?


C'est juste une vue, exactement c'est un linearlayout .


Je ne comprends pas. Vous voulez changer de visibilité? Pouvez-vous ajouter des extraits de code pertinents?


Non, je veux gérer le toucher à l'extérieur de cette vue, spécifiquement dans la barre d'action. J'ai une petite vue et une activité avec une barre d'action. Dans l'application Gmail lorsque vous supprimez un message, un "Undobar" apparaît, lorsque vous cliquez sur n'importe où - Barre d'action, arrière-plan, etc. Undobar disparaît. Je voudrais avoir le même comportement.


Implémenter un écouteur de défilement sur le listview puis sur l'appel de défilement hideundobar (true) qui devrait le faire. Ce n'est pas littéralement une touche, mais la moindre quantité de défilement retirera la barre d'annulation.


8 Réponses :


-2
votes

Vous pouvez obtenir tous les événements tactiles de votre activité code> à l'aide du code ci-dessous. Je suppose que ce code obtiendrait les touches de Actionbar code> aussi.

public class MainActivity extends Activity {
...
// This example shows an Activity, but you would use the same approach if
// you were subclassing a View.
@Override
public boolean onTouchEvent(MotionEvent event){ 

    int action = MotionEventCompat.getActionMasked(event);

    switch(action) {
        case (MotionEvent.ACTION_DOWN) :
            Log.d(DEBUG_TAG,"Action was DOWN");
            return true;
        case (MotionEvent.ACTION_MOVE) :
            Log.d(DEBUG_TAG,"Action was MOVE");
            return true;
        case (MotionEvent.ACTION_UP) :
            Log.d(DEBUG_TAG,"Action was UP");
            return true;
        case (MotionEvent.ACTION_CANCEL) :
            Log.d(DEBUG_TAG,"Action was CANCEL");
            return true;
        case (MotionEvent.ACTION_OUTSIDE) :
            Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
                    "of current screen element");
            return true;      
        default : 
            return super.onTouchEvent(event);
    }      
}


1 commentaires

Pas le fait que les vues sur le dessus consomment motionvents



0
votes

Avez-vous essayé un Ontouchevent Code> sur votre Framelayout ..?

Je ne l'ai pas essayé mais je pense que c'est logique pour moi que, dans le cas de MotionEvent code> Sur cette mise en page action_outide code> doit être tirée. p>

Essayez ce qui suit. P>

public boolean onTouchEvent(MotionEvent event)  
{  

       if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  

             undoBar.setVisibility(View.GONE);
       }  
       return true;  
}  


2 commentaires

Maintenant, j'utilise framelayout mais il ne traite pas de touches sur ActionBar


Oui, et c'est aussi important pour moi. Dans la demande Gmail, ils ont réussi à faire cela ...



0
votes

Il y a 2 solutions possibles.

Comme je l'ai mentionné dans les commentaires, vous pouvez implémenter un écouteur de défilement sur votre listview et simple appelé hideundobar (true) sur le moindre défilement.

ou

Vous pouvez modifier le undobarcontroller . Vous remarquerez que la barre d'annulation est simplement une vue SLAP A oncocuschange écouteur sur la vue dans le constructeur et dans la méthode Afficher la méthode setFocus à la vue.

Dans votre Onfocuschange Vérifiez si la vue a perdue la mise au point et appelez hideundobar (true) . .

Mise à jour

J'ai créé un gist ici https://gist.github.com/atgheb/5551961 Montrant comment changer le Undobarcontroller Pour ajouter la fonctionnalité où il se cache lorsqu'il perd la mise au point.

Je ne l'ai pas testé mais je ne vois pas pourquoi cela ne fonctionnera pas.


6 commentaires

Désolé raté cela. Comment est votre barre d'action? Si vous pouvez installer une mise en page personnalisée, vous pouvez mettre une disposition linéaire vide et définir un événement OnClick sur la disposition vide pour fermer le panier. OnCliquez similaire de tous les éléments de menu masquer la barre d'annulation.


J'ai un grand titre et deux icônes. Je voudrais gérer des touches sur eux aussi bien comme cela se produit dans l'application Gmail.


Eh bien, vous pouvez créer une mise en page personnalisée pour la barre de titre qui possède toutes les fonctionnalités dont vous avez besoin. Vous pouvez mettre votre titre aussi bien que vos éléments de menu et de cette façon, vous pouvez enregistrer votre fragment ou votre activité en tant qu'amardeur click sur chacun d'eux. Ensuite, dans votre méthode OnClick La première chose que vous faites est de cacher la barre d'annulation, puis faites ce que vous voulez. Sinon, si vous utilisez SherlockactionBar, vous pouvez pirater cette bibliothèque pour faire ce que vous voulez.


Pensez-vous que cela a été fait comme ça dans la demande Gmail? Je pense qu'il y a une meilleure façon de faire cela ...


Eh bien, la barre d'annulation pourrait simplement être une boîte de dialogue personnalisée empoisonnée au bas de l'écran. Cela étant dit Undobar a été écrit par un gars qui travaille sur Google alors qui sait vraiment comment ils l'ont fait. Cela pourrait même être une activité transparente et ils finissent simplement lorsque quelqu'un clique sur l'arrière-plan.


L'exemple que j'utilise est de Guy de Google, mais il l'a mis en œuvre de manière beaucoup moins utilisable. Il ne peut pas être implémenté de la boîte de dialogue car elle nécessiterait deux horloges.



6
votes

Essayez de remplacer DispatchTouchevent de votre activité.

dispatchTouchEvent(MotionEvent event){

     int x= event.getRawX();
     int y= event.getRawY();

      return super().dispatchTouchEvent(event)||[YourView].onTouch(event);    
}


0 commentaires

4
votes

Pour attraper des événements tactiles pour l'écran entier, y compris la barre d'action, ajoutez une vue à la fenêtre.

View overlayView = new View(this);
WindowManager.LayoutParams p = new WindowManager.LayoutParams();
p.gravity = Gravity.TOP;
p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
p.token = overlayView.getWindowToken();
overlayView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View view, MotionEvent event) {
        // Get the action bar
        int actionBarHeight = actionBar.getHeight();
        if ((event.getAction() == MotionEvent.ACTION_DOWN)
            && (event.getRawY() < actionBarHeight)) {
            // Touch inside the actionBar so let's consume it
            // Do something
            return true;
        }
        return false;
    }
});
WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(overlayView, p);


1 commentaires

Comment vous obtenez Windowtoken d'une mise en page qui n'a pas encore été attachée ?! supervisionview



0
votes
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH

1 commentaires

L'inconvénient de cela est que l'événement tactile sera également livré à la vue de fond.



0
votes

Je n'étais pas satisfait de l'une des réponses que j'ai trouvées ici. Ma solution consiste à joindre un auditeur tactile à la vue parent, comme: xxx


1 commentaires

Si votre vue parent a des boutons enfants ou d'autres éléments cliquables, votre Oventouchllistener tirera-t-il?