73 votes

Android : Comment empêcher les événements tactiles d'être transmis d'une vue à celle en dessous ?

En utilisant spécifiquement le code ci-dessous, existe-t-il un moyen de le modifier afin que l'activité sous cette vue nouvellement créée ne reçoive aucun geste ?

 View v1 = new View(this);    
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
 1000,
 50,
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
 PixelFormat.OPAQUE);

params.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.addView(v1, params);

109voto

John Giotta Points 5606

Ajoutez une onTouchEvent à la vue avec la première position puis retournez vrai. True indiquera à l'événement bouillonnant que l'événement a été consommé et empêchera donc l'événement de se propager vers d'autres vues.

 protected boolean onTouchEvent (MotionEvent me) {
    return true;
}

Pour v1 vous feriez une importation :

 import android.view.View.OnTouchListener;

Ensuite, définissez le onTouchListener :

 v1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});

67voto

vovahost Points 1123

À partir du code

 View v1 = new View(this);   
v1.setClickable(true);
v1.setFocusable(true);

OU

À partir de XML

 <View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My button"
    android:focusable="true"
    android:clickable="true"/>

Cela empêchera les événements de toucher et de cliquer d'être propagés aux vues qui restent en dessous de votre vue. Ou si vous gonflez la vue puis ajoutez au .xml android:clickable="true"

25voto

Dhrumil Patel Points 564

Vous pouvez le faire aussi. Vous pouvez régler l'écouteur tactile sur la vue enfant, puis dans l' onTouch() , vous pouvez bloquer intercept touch event du parent.

c'est à dire

 View v = findViewById(R.id.sample_view);
v.setOnTouchListener(new OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // Disallow the touch request for parent scroll on touch of child view
    v.getParent().requestDisallowInterceptTouchEvent(true);
    return false;
    }
});

12voto

Vous ajoutez une vue comme ci-dessous, mais assurez-vous que c'est la dernière vue que vous ajoutez à votre xml. Le dernier élément du XML est l'élément qui se trouve au-dessus de toutes les autres vues en dessous.

 <View
        android:id="@+id/blocking_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#AA666666"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"/>

3voto

Pb Studies Points 542

tout ce que vous avez à faire est d'appeler

 arg0.getParent().requestDisallowInterceptTouchEvent(true);

au début de votre fonction onTouch. Comme ça -

     @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        arg0.getParent().requestDisallowInterceptTouchEvent(true);
        switch(arg1.getActio){
        }

        return false; 

     }

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