Mover los diseños cuando teclado en pantalla se muestra?
-
21-09-2019 - |
Pregunta
Tengo un par de elementos en un RelativeView con la parte inferior align conjunto de atributos, cuando el teclado en pantalla aparece los elementos están ocultos por el teclado en pantalla.
Me gustaría que se muevan de manera que si hay suficiente espacio en la pantalla que se muestran por encima del teclado, o para hacer la parte superior del teclado desplegable para que el usuario todavía se pueden ver los elementos.
Cualquier ideas sobre cómo abordar esto?
Solución
Sí, echa un vistazo a este artículo sobre la sitio de desarrolladores de Android, que describe cómo el marco maneja el teclado en pantalla que aparece.
El atributo android:windowSoftInputMode
se puede utilizar para especificar qué debe hacerse sobre una base per-actividad:. Si el diseño se cambia el tamaño o si se desplaza etc.
Otros consejos
También puede utilizar este código en el método onCreate()
:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Añadir en AndroidManifest.xml para su actividad:
android:windowSoftInputMode="adjustPan|adjustResize"
Hacer cambios en la actividad de su archivo de manifiesto como
windowSoftInputMode="adjustResize"
o
Haga cambios en su método onCreate()
en la clase de actividad como
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
problema similar me enfrentaba con mi diseño que consisten en vista de desplazarse en el interior. Siempre que intente seleccionar texto en EditarTexto, copiar / cortar / pegar barra de acción se mueve hacia arriba con la de abajo código, como tal, no cambia el tamaño de diseño
android:windowSoftInputMode="adjustPan"
Mediante la modificación a la siguiente
1) AndroidManifest.xml
android:windowSoftInputMode="stateVisible|adjustResize"
2) Archivo style.xml, en el estilo de la actividad
<item name="android:windowActionBarOverlay">true</item>
Se trabajó. !!!!!!!!!!!!
En AndroidManifest.xml, no se olvide de establecer:
android:windowSoftInputMode="adjustResize"
y para RelativeLayout dentro ScrollView, sistema:
android:layout_gravity="center" or android:layout_gravity="bottom"
que va a estar bien
para la actividad en su inserción méthode alcrear debajo de la línea
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
y para los fragmentos en su método onCreate
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Hay 3 pasos a seguir para desplazarse pantalla hacia arriba.
- Escribe en el archivo de manifiesto para su actividad:
androide: windowSoftInputMode = "adjustResize"
- Añadir línea siguiente en el método OnCreate () de su actividad
GetWindow () setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);.
- A continuación, coloque toda su vista en "ScrollView" en el archivo XML como:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:background="@drawable/bg" android:layout_height="match_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_gravity="center" > <TextView /> ......... <TextView /> <EditText > <requestFocus /> </EditText> <Button /> </RelativeLayout> </ScrollView>
P.S. No se olvide de añadir androide:. Layout_gravity = "centro" en la matriz de disposición relativa
He intentado un método de Diego Ramírez, funciona. En AndroidManifest:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
...
</activity>
En activity_main.xml:
<LinearLayout ...
android:orientation="vertical">
<Space
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
<EditText
android:id="@+id/edName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/first_name"
android:inputType="textPersonName" />
<EditText ...>
...
</LinearLayout>
He encontrado una solución a mis problemas que es bastante mismos que los suyos.
En primer lugar, sólo tiene un LinearLayout con 2 elementos, un ImageView y una wich LinearLayout contiene 2 EditarTexto y un botón, por lo que necesitan para mantenerlos separados en pantalla completa sin teclado, y cuando aparece el teclado que debe buscar más cerca.
Así que he añadido la vista entre ellas con el atributo de altura y peso en 0DP 1, que me permitieron dejar mis puntos de vista se separan una de las formas entre sí. y cuando el teclado appers, ya que no tienen una altura fija, que acaba de cambiar el tamaño y mantener el aspecto.
Voila! El cambio de tamaño disposición y la distancia entre mi punto de vista es el mismo que el teclado está o no presente.
Aquí está llena código de manifiesto
<activity
android:name=".activities.MainActivity"
android:windowSoftInputMode="adjustResize"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
si se encuentra en fragmentos entonces usted tiene que añadir el siguiente código a su onCreate en su actividad se resuelve problema para mí
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
En el archivo de manifiesto añadir la línea de abajo. Se trabajará
<activity name="MainActivity"
android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
Está bien esto es muy tarde sin embargo he descubierto que si se agrega una vista de lista debajo de la edición de texto a continuación, el teclado se moverá todas las presentaciones en virtud de que EditarTexto sin mover el ListView
<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"
/>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"//can make as 1dp
android:layout_below="@+id/et" // set to below editext
android:id="@+id/view"
>
**<any layout**
Esta es la única solución que funcionó para mí.
Here is the solution for this fix
- android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.
public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();
public CommentKeyBoardFix(Activity activity)
{
FrameLayout content = activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}
private void possiblyResizeChildOfContent()
{
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious)
{
int heightDifference = 0;
if (heightDifference > (usableHeightNow /4))
{
// keyboard probably just became visible
frameLayoutParams.height = usableHeightNow - heightDifference;
}
else
{
// keyboard probably just became hidden
frameLayoutParams.height = usableHeightNow;
}
mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}
private int computeUsableHeight()
{
mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
return contentAreaOfWindowBounds.height();
}
}
And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java
Acabo de añadir la siguiente línea en el diseño de alto nivel y todo funcionó:
android:fitsSystemWindows="true"