Scrollview dentro de un fragmento de viewpager no se desplaza cuando se muestra el teclado

Tengo una actividad que tiene un contenido de diseño como sigue:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" style="@style/ToolBarStyle.Event" /> <com.mypackage.corecode.ui.view.SlidingTabLayout android:id="@+id/sliding_tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary_color" /> <android.support.v4.view.ViewPager android:id="@+id/vendor_main_tabview_pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 

Y dentro de viewpager, tengo un fragmento que tiene la siguiente disposición:

 <?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"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:weightSum="3" android:orientation="horizontal"> <EditText android:theme="@style/ScrollableContentThemeNoActionBar" android:id="@+id/edit_text_vendor_sms_phone_number" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:inputType="number" /> <Button android:id="@+id/button_send_sms" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> </ScrollView> 

Cuando el contenido dentro del fragmento no se ajusta a la pantalla, el scrollview permite al usuario ver el contenido que está debajo de la pantalla. (Funciona como se esperaba)

El problema es cuando el editor obtiene el foco, el teclado se superpone al área de edición, en lugar de la vista de desplazamiento que hace que el contenido se desplace.

Espero que el fragmento de manejar el teclado mostrado y scrollview para encajar el teclado en la pantalla.

¿O estoy equivocado y la actividad es responsable del teclado? Dado que la vista raíz en el diseño de la actividad es linearlayout, ¿está restringiendo la expansión?

He intentado envolver todo el contenido del diseño de la actividad con un scrollview, pero esta vez no aparece viewpager en la pantalla si no le doy un tamaño fijo. Incluso cuando lo hago, termino teniendo un scrollview dentro del fragmento que está bajo el scrollview de la disposición principal y todavía el teclado está flotando sobre el edittext.

Estoy un poco perdido aquí, mi objetivo es poder desplazar el fragmento de contenido cuando el edittext se centra, sino que el teclado se superpone a la edittext en la actualidad.

    Puedo confundir, pero es probablemente debido a errores conocidos de Android, todo lo que necesitas es añadir la siguiente clase a tu proyecto:

     public class AndroidBug5497Workaround { // For more information, see https://code.google.com/p/android/issues/detail?id=5497 // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. public static void assistActivity (Activity activity) { new AndroidBug5497Workaround(activity); } private View mChildOfContent; private int usableHeightPrevious; private FrameLayout.LayoutParams frameLayoutParams; private AndroidBug5497Workaround(Activity activity) { FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); mChildOfContent = content.getChildAt(0); mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); } private void possiblyResizeChildOfContent() { int usableHeightNow = computeUsableHeight(); if (usableHeightNow != usableHeightPrevious) { int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); int heightDifference = usableHeightSansKeyboard - usableHeightNow; if (heightDifference > (usableHeightSansKeyboard/4)) { // keyboard probably just became visible frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; } else { // keyboard probably just became hidden frameLayoutParams.height = usableHeightSansKeyboard; } mChildOfContent.requestLayout(); usableHeightPrevious = usableHeightNow; } } private int computeUsableHeight() { Rect r = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(r); return (r.bottom - r.top); } } 

    Y luego simplemente usarlo llamando assistActivity() método assistActivity() en su Actividad que contiene ViewPager y SlidingTabLayout :

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...); AndroidBug5497Workaround.assistActivity(this); ... } 

    Para más verificación de antecedentes este hilo.

    Tuve un problema similar con un ListView dentro de un ScrollView. OnTouchListener agregar un OnTouchListener similar con su ScrollView dentro de OnCrateView .

     myList.setOnTouchListener(new ListView.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(false); break; } // Handle ListView touch events. v.onTouchEvent(event); return true; } }); 

    Aquí hay otra respuesta que podría ayudarle.

    Creo que necesitas usar adjustPan o adjustResize para el ajuste automático del espacio cuando se muestra un teclado. Según el doc:

    "AdjustResize" La ventana principal de la actividad siempre se redimensiona para hacer espacio para el teclado virtual en la pantalla.

    "AdjustPan" La ventana principal de la actividad no se redimensiona para hacer espacio para el teclado suave. Por el contrario, el contenido de la ventana se cuelga automáticamente para que el enfoque actual nunca sea oscurecido por el teclado y los usuarios siempre pueden ver lo que están escribiendo. Esto es generalmente menos deseable que el cambio de tamaño, porque el usuario puede necesitar cerrar el teclado suave para obtener e interactuar con partes oscurecidas de la ventana.

    Usted puede declarar uno de estos en su manifiesto bajo etiqueta de actividad como este: android: windowSoftInputMode = "stateUnchanged | adjustResize

    Espero que esto cubra su requisito.

    Tienes que crear la subclase de ViewPager luego anular el onTouchEvent como se muestra en este

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.