2013-04-17 17 views
6

Mam układ górnego paska z nagłówkiem, pionowym menu i przezroczystym widokiem tła.Usunięcie obiektu OnClickListener w widoku powoduje usunięcie wszystkich zdarzeń dotykowych w widokach za

Po naciśnięciu przycisku btn_menu menu pionowe jest otwierane za pomocą animacji. Gdy menu jest otwarte, ustawiam OnClickListener na przezroczystym widoku tła, który zamyka menu po kliknięciu przezroczystego tła. Podczas zamykania menu usunąć OnClickListener z widoku tła, używając:

mTopBarBg.setOnClickListener(null); 

Problemem jest to, że wydaje się, aby usunąć wszystkie zdarzenia odrobiną poglądów za nim (ustawiony w content_container głównego układu) . Na przykład. a ViewPager, który nie wykrywa już przesunięcia, lub ListView, który nie przewija się i nie można już go kliknąć, podczas gdy wcześniej działały poprawnie.

Co jest nie tak?

w górnym pasku fragmentu

private void toggleMenu(int duration){ 
    if(mMenuIsOpen){ 

     TranslateAnimation anim1 = new TranslateAnimation(0,0,0,-(mHeight-mMenuVerticalOffset)); 
     anim1.setFillAfter(true); 
     anim1.setDuration(duration); 
     mVerticalMenu.setAnimation(anim1); 

     AlphaAnimation anim2 = new AlphaAnimation(0.7f, 0.0f); 
     anim2.setFillAfter(true); 
     anim2.setDuration(duration); 
     mTopBarBg.setAnimation(anim2); 

     mTopBarBg.setOnClickListener(null); 

     mMenuIsOpen = false; 
    } 
    else{ 

     TranslateAnimation anim1 = new TranslateAnimation(0,0,-(mHeight-mMenuVerticalOffset),0); 
     anim1.setFillAfter(true); 
     anim1.setDuration(duration); 
     mVerticalMenu.setAnimation(anim1); 

     AlphaAnimation anim2 = new AlphaAnimation(0.0f, 0.7f); 
     anim2.setFillAfter(true); 
     anim2.setDuration(duration); 
     mTopBarBg.setAnimation(anim2); 

     mTopBarBg.setOnClickListener(mBgClickListener); 

     mMenuIsOpen = true; 
    } 
} 

układ główny

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/mainbg" 
     android:scaleType="centerCrop"/> 

    <FrameLayout 
     android:id="@+id/content_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="44dp" /> 

    <FrameLayout 
     android:id="@+id/top_bar_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clipChildren="false" /> 

</RelativeLayout> 

układ górny pasek

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00000000" > 

    <View 
     android:id="@+id/top_bar_bg" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#000000" 
     android:visibility="gone" /> 

    <LinearLayout 
     android:id="@+id/vertical_menu" 
     android:layout_width="50dp" 
     android:layout_height="match_parent" 
     android:layout_marginTop="44dp" 
     android:background="#ffffff" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     <!-- vertical menu layout --> 

    </LinearLayout> 

    <RelativeLayout 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="44dp" 
     android:background="#ffffff" > 

     <Button 
      android:id="@+id/btn_menu" 
      android:layout_width="50dp" 
      android:layout_height="44dp" 
      android:background="@drawable/menubtn" />  

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="44dp" 
      android:layout_toRightOf="@id/btn_menu" 
      android:gravity="center" > 

      <ImageView 
       android:layout_width="130dp" 
       android:layout_height="44dp" 
       android:src="@drawable/logo" /> 
     </LinearLayout> 
    </RelativeLayout> 

</RelativeLayout> 

Górny pasek menu z otwartą

enter image description here

+3

Spróbuj również użyć 'setClickable (false)' z niewidzialnym widokiem. – Luksprog

+0

Skończyło się na użyciu onTouchListener do kontrolowania, czy słuchacz zużywa zdarzenie, czy nie, ale twoje rozwiązanie również działa. Połóż to jako odpowiedź, a ja to zaakceptuję. Dzięki. – jul

Odpowiedz

12

spróbować również użyć setClickable(false) na nakładce View. Korzystanie z metody powoduje, że kliknięcie jest klikalne i prawdopodobnie "zjada" twoje przyszłe zdarzenia (nawet po użyciu null, ponieważ nie zmienia poprzedniej właściwości zestawu ustawionych kliknięć).

Po stronie nie twój układ jest bardzo skomplikowany w stosunku do tego, co próbujesz zrobić. Dokładniej układ jest głębszy niż powinien być. Nie ma sensu posiadanie pojemnika FrameLayout, gdy ma on takie same właściwości, jak RelativeLayout twojego paska (możesz użyć znacznika include, aby dołączyć słupek bez potrzeby dodawania tego dodatkowego FrameLayout). Możesz również stracić top_bar_bgView i ustawić słuchacza bezpośrednio na root RelativeLayout. Wreszcie, wewnętrzny nagłówek RelativeLayout (nagłówek) mógł zostać usunięty i zastąpiony przez prawidłowe umieszczenie widoków podrzędnych w katalogu głównym Relativelayout pod białym pustym (View) pod nimi (z odpowiednimi wymiarami, aby zasymulować białe tło).

+4

Chciałbym dodać, że musisz zrobić 'setClickable (false)' _after_' setOnClickListener (null) '. Właściwość jest zachowywana jako prawdziwa, jeśli robisz to w inny sposób, a nakładka zapobiega blokowaniu widoków za kliknięciem. Zastanawiam się, dlaczego to nie działa dla mnie, ale to dlatego, że ustawiałem właściwość clickable przed pustym detektorem. –

1

Zamiast usuwania onClickListener można wykonać jedną thing.Always ustawić onClickListener i używać boolean variable prześledzić menu i wyłączać. Tak Twój kod będzie coś

boolean is_menu_open = false; 
public void onClick(View v){ 
     if(is_menu_open){ 
      hidemenu; 
      is_menu_open = false; 
     } else 
      do nothing 
    } 

i kiedy pokazuje to menu ustawione is_menu_open do true

+1

Problem polega na tym, że 'onClick' pochłania zdarzenie, a odbiornik odsłuchu z tyłu nie jest wyzwalany. – jul

Powiązane problemy