2013-04-15 18 views
9

Ich habe eine horizontale ScrollView in einem ViewPager. Um zu verhindern, der ViewPager gescrollt werden, wenn das Ende des Scroll erreicht ich diese Klasse zu verwenden, wie pro Hinweis auf SO:OnClickListener auf Ansichten in einem benutzerdefinierten ScrollView

public class CustomScrollView extends HorizontalScrollView { 

public CustomScrollView(Context p_context, AttributeSet p_attrs) { 
    super(p_context, p_attrs); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent p_event) { 

    return true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent p_event) { 


    if (p_event.getAction() == MotionEvent.ACTION_MOVE 
      && getParent() != null) { 
     getParent().requestDisallowInterceptTouchEvent(true); 
    } 

    return super.onTouchEvent(p_event); 
} 
} 

Die onInterCeptTouchEvent scheint in ihn jeden Klick auf diese Ansicht und alles zu konsumieren. Wenn ich Views in das ScrollView setze, wird ihr OnClickListener s nicht angerufen.

Wenn ich lassen onInterceptTouchEvent false zurückgeben, werden die OnClickListener s aufgerufen, aber die ScrollView kann nicht gescrollt werden.

Wie kann ich anklickbare Ansichten innerhalb dieses ScrollView setzen?

EDIT: Nach der Implementierung von Rotems Antwort funktioniert die onClickListener, aber es wird nicht nur auf Klickereignisse ausgelöst, sondern auch auf andere, wie Fling. Wie kann dies verhindert werden?

Antwort

5

Nun, Minuten nach dem Start eine Prämie fand ich heraus, wie es funktioniert:

in onInterceptTouchEvent I

return super.onInterceptTouchEvent(p_event); 
+2

wenn Sie Super mit gleichen Argumente nennen, gibt es keine Notwendigkeit, die Methode zu überschreiben – Rotem

+0

Sie die [Javadoc] Stellen Sie sicher, lesen (http://developer.android.com/ Referenz/android/view/ViewGroup.html # onInterceptTouchEvent% 28android.view.MotionEvent% 29) für Ihre Methoden, die Ihr Problem beschreibt. Wie Rotem sagt, müssen Sie dieses nicht implementieren. –

11

versuchen, onTouchEvent innerhalb der Implementierung von onInterceptTouchEvent aufzurufen und dann false zurückgeben.

+0

Works, danke sehr viel :) – FWeigl

1

Hier Komplettlösung Antworten auf diese Frage mit.

public class CustomHorizontalScrollView extends HorizontalScrollView { 

     public CustomHorizontalScrollView(Context context) { 
       super(context); 

     } 
     public CustomHorizontalScrollView(Context context, AttributeSet attrs) { 
       super(context, attrs); 
     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
       boolean result = super.onInterceptTouchEvent(ev); 
       if(onTouchEvent(ev)) { 
         return result; 
       } else { 
         return false; 
       } 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      if (ev.getAction() == MotionEvent.ACTION_MOVE 
        && getParent() != null) { 
       getParent().requestDisallowInterceptTouchEvent(true); 
      } 
       return super.onTouchEvent(ev); 
     } 

} 
Verwandte Themen