8 Réponses :
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);
}
}
Pas le fait que les vues sur le dessus consomment motionvents code>
Avez-vous essayé un Je ne l'ai pas essayé mais je pense que c'est logique pour moi que, dans le cas de Essayez ce qui suit. P> Ontouchevent Code> sur votre Framelayout ..?
MotionEvent code> Sur cette mise en page
action_outide code> doit être tirée. p>
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
undoBar.setVisibility(View.GONE);
}
return true;
}
Maintenant, j'utilise framelayout code> 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 ...
Il y a 2 solutions possibles. P>
Comme je l'ai mentionné dans les commentaires, vous pouvez implémenter un écouteur de défilement sur votre ou p>
Vous pouvez modifier le Dans votre listview code> et simple appelé
hideundobar (true) code> sur le moindre défilement. P>
undobarcontroller code>. Vous remarquerez que la barre d'annulation est simplement une vue code> SLAP A code> oncocuschange code> écouteur sur la vue code> code> dans le constructeur et dans la méthode Afficher la méthode setFocus à la vue. p>
Onfocuschange Code> Vérifiez si la vue a perdue la mise au point et appelez
hideundobar (true) code>. p>.
Mise à jour h1>
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.
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); }
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);
Comment vous obtenez Windowtoken d'une mise en page qui n'a pas encore été attachée ?! supervisionview
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
L'inconvénient de cela est que l'événement tactile sera également livré à la vue de fond.
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:
Si votre vue parent a des boutons enfants ou d'autres éléments cliquables, votre Oventouchllistener tirera-t-il?
Vous devriez simplement remplacer la méthode DispatchTouchevent (EV: MotionEvent)
Regardez cet exemple de renvoi de snackbar indéfini P> ou vérifiez la totalité < un href = "https://gist.github.com/and291/ce5704c4163f8dcd9d06b1ab6a9850cf" rel = "nOfollow noreferrer"> gist p> p>
Solution parfaite pour mon cas. Merci.
"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 code>.
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 code> puis sur l'appel de défilement
hideundobar (true) code> qui devrait le faire. Ce n'est pas littéralement une touche, mais la moindre quantité de défilement retirera la barre d'annulation.