7

Mam pasek narzędzi z przezroczystym/półprzezroczystym tłem, który pokrywa zawartość. Tak więc za paskiem narzędzi mogą pojawiać się widoki, które można kliknąć. Problem polega na tym, że nie można ich kliknąć na pasku narzędzi, ponieważ pasek narzędzi wychwytuje zdarzenie click.Jak wyświetlić widoki za paskiem narzędzi?

Próbowałem ustawić android:clickable="false", android:focusable="false" i android:focusableInTouchMode="false" dla paska narzędzi, ale nie ma to żadnego wpływu. Jak wysłać kliknięcie z paska narzędzi do widoku podstawowego?

Odpowiedz

18

Zobacz implementację Toolbar. To spożywa zdarzenia dotykowe, niezależnie od atrybutu clickable.

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    // Toolbars always eat touch events, but should still respect the touch event dispatch 
    // contract. If the normal View implementation doesn't want the events, we'll just silently 
    // eat the rest of the gesture without reporting the events to the default implementation 
    // since that's what it expects. 

    final int action = MotionEventCompat.getActionMasked(ev); 
    if (action == MotionEvent.ACTION_DOWN) { 
     mEatingTouch = false; 
    } 

    if (!mEatingTouch) { 
     final boolean handled = super.onTouchEvent(ev); 
     if (action == MotionEvent.ACTION_DOWN && !handled) { 
      mEatingTouch = true; 
     } 
    } 

    if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { 
     mEatingTouch = false; 
    } 

    return true; 
} 

Roztwór rozciąga się od Toolbar i zastąpić onTouchEvent.

public class NonClickableToolbar extends Toolbar { 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 
-7

Twój projekt musi zostać dostosowany. Nie można zapewnić klikalnych widoków za przezroczystym/półprzezroczystym paskiem narzędzi. Musisz podać górną wyściółkę równą wysokości paska narzędzi i/lub zastosować wzór szybkiego powrotu dla paska narzędzi.

0

Pasek narzędzi pochłania wszystkie kliknięcia. Musisz podklasy Pasek narzędzi, takich jak już wspomniano @Matthias Robbens.

Jeśli nadal chcesz, aby móc ustawić słuchacza kliknij na pasku narzędzi, użyj tego:

/** Do not eat touch events, like super does. Instead map an ACTION_DOWN to a click on this 
* view. If no click listener is set (default), we do not consume the click */ 
@SuppressLint("ClickableViewAccessibility") 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_DOWN){ 
     return performClick(); 
    } 

    return false; 
} 
Powiązane problemy