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:
- Cómo cambiar el tamaño de Android ScrollView
- ¿Cambiar la pestaña de desplazamiento / desplazamiento en combinación con ScrollView?
- ¿Hay una manera de desactivar / editar el desvanecimiento que una vista de lista tiene en sus bordes?
- Desplazar una vista / disposición oculta desde abajo
- Desplácese hasta la última línea de TableLayout dentro de ScrollView
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?
- ¿Cómo trabajar, cuando listview dentro del scrollview?
- ListView dentro de un ScrollView
- Agregar una ScrollView simple a la Galería provoca una pérdida de memoria
- ¿Hay una manera de desplazarse mediante programación una vista de desplazamiento a un texto de edición específico?
- Android View.OnKeyListener: haga clic una vez, ejecute dos veces
- Cómo agregar scrollview a keyboardView en android
- Ocultar FAB en NestedScrollView al desplazarse
- distinguir un golpe y hacer clic en android (pasar el evento a otra vista si es un golpe)
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); } }
- Cambiar el tamaño de la vista de la superficie para el cambio de la relación de aspecto en la visualización de vídeo en android
- Cómo llamar a un método en MainActivity de otra clase?