android - para - Cómo mantener el tamaño de la imagen de fondo cuando se muestra el teclado del software
teclado google (9)
Cuando se muestra el teclado del software, cambia el tamaño de mi diseño y, por lo tanto, aprieta la imagen de fondo. Mi pregunta es básicamente un duplicado de esta pregunta, que se explica de una manera muy buena:
El teclado del software cambia el tamaño de la imagen de fondo en Android
Sin embargo, esa pregunta se cerró cuando encontraron un truco para resolverlo. No puedo usar este truco. Mi diseño completo está dentro de un ScrollView, y necesito poder usar este scrollview correctamente en todo momento. Al usar android: windowSoftInputMode = "stateVisible | adjustPan", el usuario no podrá desplazarse hacia abajo y ver la parte inferior de la pantalla mientras se muestra el teclado, ya que el diseño existirá parcialmente detrás del teclado. Por lo tanto, la solución es inaceptable para mí. ¿Hay mejores soluciones por ahí?
Aclamaciones,
¿Qué tal una solución donde el ''fondo'' es un diseño? ¿Podemos inflar un diseño, convertirlo en el tamaño completo de la ventana y luego insertarlo como fondo de ventana?
Después de mucho tiempo buscando ...
Ponga android:windowSoftInputMode="adjustPan|stateVisible"
en cada actividad
Después de varios días de piratería, finalmente logré construir una solución tan avanzada que realmente podría resultar perjudicial leerla. Coloco un ImageView con el fondo detrás de la vista de desplazamiento y configuro scaleType = "matrix" para que no se encoja cuando se muestra el teclado.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black"
>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/mah_kewl_background"
android:scaleType="matrix"
/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
>
<RelativeLayout
android:id="@+id/smsLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="PLUNX"
/>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
En realidad me encontré con un problema similar no hace mucho tiempo. Sin embargo, me topé con la respuesta correcta con un poco de trabajo.
En su manifiesto de Android para este proyecto, adjunto a la actividad específica que está utilizando, use la línea android:windowSoftInputMode="adjustPan|stateVisible"
en la etiqueta de actividad.
adjustPan
básicamente significa que su actividad no cambiará de tamaño para ajustarse al teclado virtual, y stateVisible significa que el teclado virtual se mostrará cuando se solicite (esto puede ser stateAlwaysVisible
, etc. si es necesario)
Estaba buscando en Google una solución para este problema exacto cuando encontré esto, y después de investigar un poco encontré una solución que creo que es un poco mejor. En lugar de piratear con un ImageView, puedes usar esto de tu actividad:
getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background);
Espero que ayude a alguien más en busca de una solución para esto.
No puedo comentar tu respuesta, pero me gustaría añadir algo.
Entiendo su dilema y por qué la solución a la que se vinculó no es una solución completa para su situación (ya que no puede desplazarse al final de la vista). Tengo una situación similar con un gran cuadro de texto de edición desplazable. Cuando el teclado suave aparece, no me gusta que mi fondo se aplaste.
He intentado su solución y, aunque a primera vista parece funcionar, hay algunas situaciones en las que podría no ser la ideal:
- Si permite que su aplicación tenga un modo horizontal, el fondo no cambiará de tamaño ni se estirará
- Si ejecuta su aplicación en un dispositivo con una pantalla más grande o dpi, su fondo puede no llenar la pantalla
Básicamente, parece que cuando configuras scaleType
en matrix
le estás diciendo a Android que dibuje el fondo 1: 1 y no a escala. Entonces, ¿qué sucede cuando abres el teclado scrollView
utilizando tu solución? scrollView
tu scrollView
como tu imageView
están imageView
tamaño como siempre, pero la imageView
imagen que configuraste sigue siendo 1: 1, por lo que sigue mostrando la misma área.
Entonces, si, por ejemplo, su imagen de fondo se estableció en un tamaño específico (por ejemplo, 480 x 800) y llena perfectamente su Nexus One, en el momento en que gire hacia el paisaje, tendrá un área negra a lo largo de la derecha.
Esto es discutible, por supuesto, si su fondo es simplemente un patrón que se repite, en cuyo caso puede hacerlo extremadamente grande y, con suerte, compensar varias pantallas (tal vez incluso tabletas).
O también puede suministrar diferentes fondos para diferentes tamaños de pantalla / densidades / orientaciones, pero esto todavía no tiene en cuenta la escala.
En un vano esfuerzo por tratar de resolver esto, me topé con un atributo de View
llamado android:isScrollContainer
. Este atributo le dice a ciertas vistas si se les permite o no cambiar el tamaño al mostrar el teclado virtual. Esto también es mencionado por alguien en su solución vinculada. He intentado configurar esto (en falso) en el ViewGroup
contiene mi fondo, pero cualquier elemento secundario que se desplace parece anularlo y causar el aplastamiento nuevamente.
A partir de ahora no creo que haya una solución completa para nuestra situación. Tu definitivamente funciona en algunos casos y te agradezco el esfuerzo. Esperemos que Google ofrezca una solución en el futuro, pero no creo que consideren esto como un problema / prioridad.
Puede usar la propiedad windowBackground, que hace que el dibujo se ajuste a toda la pantalla. Para hacer eso necesitas:
1- Crea un estilo:
<style name="Background" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/you_bg_drawable</item>
</style>
2- Establece tu estilo de actividad en el AndroidManifest.xml
<activity
android:name=".ui.your_activity"
android:theme="@style/Background"/>
Tal vez haya otra solución (¡realmente simple!): En styles.xml: cree un nuevo estilo como este:
<style name="Yourstyle" parent="AppBaseTheme">
<item name="android:windowBackground">@drawable/mybackground</item>
</style>
AppBaseTheme es el tema utilizado normalmente para su aplicación. Luego agregas en Manifest.xml:
<activity
android:name="com.your.app.name.Activity"
android:theme="@style/Yourstyle">
</activity>
Así que tienes el mismo estilo pero con un fondo.
Importante: ¡no establezca ningún fondo en su archivo .xml normal!
Es mi primer post y espero que ayude y disculpe mi inglés.
en Androidmanifest en el uso de etiquetas de actividad:
<activity ... android:windowSoftInputMode="adjustPan" ></activity>
verifique la referencia del desarrollador de Android