La vista de desplazamiento de Android dentro de otra vista de desplazamiento no se desplaza

Estoy tratando de poner un ScrollView dentro de otro ScrollView y he intentado las respuestas encontradas en este sitio, pero todavía no parece funcionar completamente. Aquí está el XML:

<ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="false" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textViewDirectoryDetailName" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Name" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@color/red" /> <LinearLayout android:id="@+id/linearLayoutDirectoryDetailContainImage" android:layout_width="300dp" android:layout_height="200dp" android:layout_gravity="center_vertical|center_horizontal" android:background="@drawable/general_image" android:gravity="center" android:orientation="vertical" > </LinearLayout> <ScrollView android:id="@+id/scrollView2" android:layout_width="match_parent" android:layout_height="100dp" android:focusableInTouchMode="false" > <TextView android:id="@+id/textViewDirectoryDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:autoLink="phone" android:text="098 123 45 678" android:textAppearance="?android:attr/textAppearanceLarge" /> </ScrollView> 

Y aquí está el código Java:

 parentScrollView = (ScrollView) findViewById(R.id.scrollView1); childScrollView = (ScrollView) findViewById(R.id.scrollView2); parentScrollView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View p_v, MotionEvent p_event) { childScrollView.getParent().requestDisallowInterceptTouchEvent( false); // We will have to follow above for all scrollable contents return false; } }); childScrollView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View p_v, MotionEvent p_event) { // this will disallow the touch request for parent scroll on // touch of child view p_v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); // We will have to follow above for all child scrollable contents 

Lo que parece suceder es esto: cuando tengo texto en el TextView no parece que me deja desplazar en absoluto. Simplemente se desplaza el padre. Pero cuando no tengo texto y toco al niño ScrollView no se desplaza el padre así que supongo que está trabajando entonces. Pero, ¿tienes alguna idea de por qué no funciona cuando tengo texto?

Debe utilizar NestedScrollView .

 <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <!-- --> </android.support.v4.widget.NestedScrollView> 

Tener una vista de desplazamiento dentro de otra vista de desplazamiento no es una buena práctica. Sin embargo, el código que ha utilizado podría funcionar en algunos casos. Pero puede fallar cuando tenga varios elementos. En ese caso, podría no ser capaz de identificar el gesto.

Sin embargo, puede probar esta respuesta, si ayuda ScrollView Inside ScrollView . Desactiva el toque de ScrollView padre, cuando se identifica un toque para el niño. También echar un vistazo a este post si ayuda.

Utilizo RectF para probar si su dedo localiza en el rango de su child_view.

Lo he utilizado para un caso que una mezcla entre scrollview y viewpager (que contiene dos páginas con recycleviews).

Prueba estos códigos y obtendrás lo que quieras.

 findViewById(R.id.parent_view).setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { View childV = findViewById(R.id.child_view); if (childV != null) { int[] l = new int[2]; childV.getLocationOnScreen(l); RectF rect = new RectF(l[0], l[1], l[0] + childV.getWidth(), l[1] + childV.getHeight()); if(rect.contains( event.getX(), event.getY())) { childV.getParent() .requestDisallowInterceptTouchEvent(false); childV.onTouchEvent(event); return true; } } childV.getParent() .requestDisallowInterceptTouchEvent(true); return false; } }); 

No se puede usar dos Scrollview dentro Scrollview OS obtener confundir que uno tiene que desplazarse por lo que su actividad colgar por lo que no se utiliza de esta manera

Vieja pregunta sin embargo, estoy publicando lo que funcionó para mí, entiendo el problema Coz i he pasado por él también, Acabo de eliminar el ScrollView para TextView en XML, en lugar de desplazamiento implementado característica de TextView en código java. Así, XML sería:

  <TextView android:id="@+id/textViewDirectoryDetailName" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Name" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@color/red" /> <LinearLayout android:id="@+id/linearLayoutDirectoryDetailContainImage" android:layout_width="300dp" android:layout_height="200dp" android:layout_gravity="center_vertical|center_horizontal" android:background="@drawable/general_image" android:gravity="center" android:orientation="vertical" > </LinearLayout> <TextView android:id="@+id/textViewDirectoryDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:autoLink="phone" android:text="098 123 45 678" android:textAppearance="?android:attr/textAppearanceLarge" /> 

Y el código Java sería

  TextView extViewDD = (TextView)findViewById(R.id.textViewDirectoryDescription); //for Scrolling of textView textViewDD.setMovementMethod(new ScrollingMovementMethod()); //to stop parent linearlayout scrollview when touched on textview textViewDD.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

Compruebe este enlace que muestra cómo usar dos widget con funcionalidad de desplazamiento en la misma actividad. Compruebe esto debajo del código en eso.

 parentScroll.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Log.v("PARENT", "PARENT TOUCH"); findViewById(R.id.child_scroll).getParent() .requestDisallowInterceptTouchEvent(false); return false; } }); childScroll.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Log.v("CHILD", "CHILD TOUCH"); // Disallow the touch request for parent scroll on touch of // child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

Estoy casi seguro de que es imposible:

Cómo maneja los eventos de toque de android:

El padre obtiene el evento y decide si tiene que manejarlo o si debe dejarlo manejar al niño;

Así, si un scrollview maneja el tacto, el que lo maneja, es siempre el padre uno

http://developer.android.com/training/gestures/viewgroup.html

Personalmente no sé si hay una manera de entender lo que se toca detrás del scrollview padre para ver si es otro scrollview y dejar que manejar el movimiento

Esta es una posible solución que funciona bien con ScrollView y ListView dentro de ScrollView. ScrollView Inside ScrollView

Utilice este scrollview personalizado como scrollview interno:

 public class TouchMeScrollView extends ScrollView { public TouchMeScrollView(Context context) { super(context); } public TouchMeScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchMeScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public TouchMeScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public boolean onTouchEvent(MotionEvent ev) { requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(ev); } } 
  • Custom ViewPager dentro de ObservableScrollView no se mide correctamente la altura
  • ScrollView corta la parte superior y deja espacio en la parte inferior
  • Agregar un encabezado a un GridView (Android)
  • ¿Cómo distinguir el desplazamiento del usuario final de un androide ScrollView desde el desplazamiento programático?
  • Android: Dibujo sobre lienzo en Scrollview
  • ScrollView no se desplaza
  • Habilitar desplazamiento dentro de EditText que está en ScrollView
  • Dificultad con ScrollView y LinearLayout
  • Escaneando con múltiples RecyclerViews en Layout
  • Android - ScrollView como foursquare con mapas + lista
  • establecer el enfoque en la parte superior de scrollview después de una acción que sucede android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.