Cómo mantener los botones DialogFragment positivos / negativos por encima del teclado virtual

Estoy utilizando un DialogFragment. Quiero que los botones positivos y negativos permanezcan sobre el teclado cuando el usuario interactúa con un texto de edición como en el ejemplo de imágenes de abajo de una pantalla en la aplicación de tableta de Gmail.

Sin teclado suave

Con el teclado suave - los botones permanecen sobre el teclado mientras el diálogo cambia de tamaño y el contenido se desplaza

En mi intento que no funciona, aquí está mi método Dialog Fragments onCreateDialog

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater factory = LayoutInflater.from(getActivity()); final View textEntryView = factory.inflate(R.layout.my_layout, null); return new AlertDialog.Builder(getActivity()) .setTitle(getString(R.string.paypal)) .setView(textEntryView) .setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } } ) .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } } ) .create(); } 

Y aquí está el R.layout.my_layout

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/paypal_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="15dip" android:layout_marginBottom="15dip" /> <EditText android:id="@+id/edit_paypal_email" style="@style/GeneralEditText" android:hint="@string/contact_info_text_email" android:inputType="textEmailAddress" /> <View android:id="@id/horizontal_line" style="@style/HorizontalLine" android:layout_marginTop="@dimen/contact_info_line_margin_top" /> <!-- Notes --> <TextView android:text="@string/paypal_info1" style="@style/ContactInfoNotes" android:paddingBottom="5dip" /> <TextView android:text="@string/paypal_info2" style="@style/ContactInfoNotes" android:paddingBottom="5dip" /> <TextView android:text="@string/paypal_info3" style="@style/ContactInfoNotes" android:paddingBottom="5dip" /> <TextView android:text="@string/paypal_info4" style="@style/ContactInfoNotes" android:paddingBottom="5dip" /> </LinearLayout> </ScrollView> 

En mi implementación, el teclado suave aparece y cubre los botones de diálogo positivo y negativo. ¿Qué me falta para permitir que los botones permanezcan sobre el teclado?

Gracias por adelantado.

Sólo tiene que añadir esto en su onViewCreated:

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); super.onViewCreated(view, savedInstanceState); } 

Tuve el mismo problema, y ​​encontré una solución. La parte esencial del archivo de diseño:

 <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> <!-- Form items --> </ScrollView> <!-- Include the layout which contains the buttons --> <include layout="@layout/fragment_dialog_button_bar" android:layout_weight="0" /> 

Así que usted necesita para establecer el peso de los botones de layout_weight 0, mientras que el peso del scrollview es 1 o más grande.

Espero que esto sea de ayuda.

Creo que esto tiene que ver con el LinearLayout y ScrollView . Elimine la parte fillViewport de ScrollView y muestre la barra de desplazamiento en LinearLayout.

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:scrollbars="vertical" android:scrollbarAlwaysDrawVerticalTrack="true"> <!-- Stuff --> </LinearLayout> </ScrollView> 

¿Ha intentado agregar el atributo siguiente a la etiqueta de activity en su manifiesto?

 <activity android:name=".SampleActivity" android:windowSoftInputMode="adjustResize" ... > </activity> 

Esto es lo que funcionó para mí.

 public class Fragment1 extends DialogFragment{ @Override public void onViewCreated(View view, Bundle savedInstanceState){ getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); super.onViewCreated(view, savedInstanceState); } } <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:fillViewport="true" android:layout_weight="1" android:layout_height="300dp" > <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:inputType="textMultiLine|textAutoCorrect|textCapSentences" /> </ScrollView> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0" /> </LinearLayout> 
  • El fragmento de diálogo omitido vuelve a aparecer cuando se reanuda la aplicación
  • ¿Cómo puedo crear DialogFragment de ListActivity en Android?
  • Cómo hacer el ancho de DialogFragment a Fill_Parent
  • Android DialogFragment desaparece después del cambio de orientación
  • ¿Cómo puedo pasar los datos de la actividad al diálogoFragmento que invocó la actividad?
  • Cómo configurar el tamaño de fuente para el texto de los botones de diálogo
  • Fragmento de diálogo paisaje, pantalla de relleno
  • Comunicación entre fragmentos / cuadros de diálogo en android
  • Cómo configurar el título de DialogFragment?
  • No puede obtener DialogFragment para descartar programatically
  • El cuadro de diálogo de pantalla completa de Android aparece transparente y en la posición incorrecta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.