2013-05-27 15 views
12

Mam Scrollview z wielu elementówOnClickListener na Scrollview

ScrollView scroller = (ScrollView)findViewById(R.id.scrollView); 

muszę dołączyć onClickListener do Scrollview tak zrobić

scroller.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // This is all you need to do to 3D flip 
       AnimationFactory.flipTransition(viewAnimator, FlipDirection.LEFT_RIGHT); 
      } 

     }); 

Ale to nie jest wyzwalany uzyskiwanie kiedy dotykam. Jakieś pomysły?

+0

Czy jesteś pewien, że to nie jest wyzwalany uzyskiwanie? Spróbuj zalogować lub pokazać toast za pomocą metody onClick i sprawdź, czy działa. – Ahmad

+0

Tak, spróbowałem. Nie uruchamia się. Czy z tego powodu widoki są w większości podprzestrzenne? –

Odpowiedz

8

Dzieje się tak, ponieważ dziecko użytkownika ScrollView otrzymuje zdarzenie dotykowe użytkownika, a nie ScrollView. Musisz ustawić atrybut klikalny = false dla każdego dziecka z ScrollView, aby onClickListener zadziałał na ScrollView.

Alternatywnie można ustawić onClickListener dla każdego z dzieci ScrollView i poradzić sobie z nim.

5

Najlepsze rozwiązanie wydaje się umieścić LinearLayout w ScrollView i ustawić na nim setOnClickListener.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/myLayout" 
     android:clickable="true" 
     android:orientation="vertical"> 

     <!-- content here --> 
    </LinearLayout> 
</ScrollView> 

w Działaniu:

LinearLayout lin = (LinearLayout) fragment.rootView.findViewById(R.id.myLayout); 

lin.setOnTouchListener(new setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Whatever 
     } 
}); 
4

Musisz ustawić setOnClickListenerbezpośrednio na Scrollview za dziecko.

Ponieważ ScrollView może mieć tylko jedno dziecko , można po prostu użyć tego podejścia:

ScrollView scrollView = //... 

View.OnClickListener mOnClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // ... 
} 

//Set the onClickListener directly on the ScrollView's child 
scrollView.getChildAt(0).setOnClickListener(mOnClickListener); 
+0

To jest poprawna odpowiedź. Działa, a sugerowane tutaj alternatywy są ... suboptymalne. – aaaidan

+0

Jedyny problem z tym rozwiązaniem polega na tym, że przed skonfigurowaniem detektora trzeba poczekać, aż potomek 'ScrollView' zostanie dodany do drzewa. To nie jest ładne, ale użyłem postu, aby czekać, aż to się stanie, zanim uruchomię 'getChildAt (0)' – aaaidan

Powiązane problemy