2015-07-15 1 views
0

J'ai quelques vues dans ScrollView. Le problème est que lorsque je touche la vue enfant et que je la fais défiler verticalement, la vue enfant ne peut recevoir que les événements ACTION_DOWN et ACTION_CANCEL. L'événement ACTION_MOVE et ACTION_UP est manqué.
Si je touche la vue enfant et la fais défiler horizontalement, la vue enfant peut obtenir tous les événements tactiles comme prévu.
Voici mon code:
fichier xml:L'enfant de ScrollView ne peut pas recevoir les événements ACTION_MOVE et ACTION_UP lorsque vous touchez l'enfant et faites défiler verticalement

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/sv_test_tv" 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:gravity="center" 
      android:text="This is some text." 
      android:textSize="30sp" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="300dp" 
      android:background="#faa" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="300dp" 
      android:background="#faf" /> 

    </LinearLayout> 

</ScrollView> 

code java:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sv_test); 

     TextView tv = (TextView) findViewById(R.id.sv_test_tv); 
     tv.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       LogUtils.v("ScrollViewTest", "onTouch:" + getType(event.getAction())); 

       return true; 
      } 
     }); 

    } 

    private String getType(int type) { 
     switch (type) { 
      case MotionEvent.ACTION_DOWN: { 
       return "ACTION_DOWN"; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       return "ACTION_MOVE"; 
      } 

      case MotionEvent.ACTION_UP: { 
       return "ACTION_UP"; 
      } 
     } 

     return "other:" + type; 
    } 

Tout le monde peut me aider Merci beaucoup?.

Répondre

1

Vous pouvez ajouter un défilement personnalisé à votre mise en page. Créez votre scrollView personnalisé et utilisez-le dans votre mise en page.

public class VerticalScrollview extends ScrollView{ 

    public VerticalScrollview(Context context) { 
     super(context); 
    } 

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

    public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     final int action = ev.getAction(); 
     switch (action) 
     { 
      case MotionEvent.ACTION_DOWN: 
       super.onTouchEvent(ev); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       return false; // redirect MotionEvents to ourself 

      case MotionEvent.ACTION_CANCEL: 
       super.onTouchEvent(ev); 
       break; 

      case MotionEvent.ACTION_UP: 
       return false; 

      default: break; 
     } 

     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     super.onTouchEvent(ev); 
     //Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction()); 
     return true; 
    } 
} 

Ajouter <packagename..VerticalScrollview /> à la place de ScrollView.

+1

Merci beaucoup. Cela vient résoudre mon problème! – hanswim

1

Cela se produit parce que les ScrollView INTERCEPTIONS l'événement move, Jetez un coup d'oeil au code source ScrollView à onInterceptTouchEvent (MotionEvent ev) et il sera plus clair. Si vous voulez un ScrollView à l'intérieur d'un ScrollView alors je suggère de jeter un oeil à this answer

+1

Merci beaucoup. Je connais la raison maintenant. J'ai juste un TextView dans ScrollView et je veux que l'utilisateur puisse toucher et déplacer la position du TextView. Merci pour l'aide de @dn_c J'ai résolu mon problème maintenant. – hanswim

0

Essayez celui

onInterceptTouchEvent only gets ACTION_DOWN

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
MyLog.d(MyLog.DEBUG, "dispatchTouchEvent(): "+event.getAction()); 
if (isEnabled()) { 
    MyLog.d(MyLog.DEBUG, "dispatchTouchEvent()2: "+event.getAction()); 

    processEvent(event);//here you get all events include move & up 

    super.dispatchTouchEvent(event); 

    return true; //to keep receive event that follow down event 
} 
return super.dispatchTouchEvent(event); 
}