2011-05-11 26 views
22

Cuando se muestra el teclado del software, cambia el tamaño de mi diseño y comprime la imagen de fondo. Mi pregunta es básicamente un duplicado de esta cuestión, que se explica en una muy buena manera:Cómo mantener el tamaño de la imagen de fondo cuando se muestra el teclado del software

Software keyboard resizes background image on Android

Sin embargo, esa pregunta se cerró cuando encontraron un truco para resolverlo. No puedo usar este truco. Todo mi diseño está dentro de ScrollView, y necesito poder usar esta vista de desplazamiento 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 alguna solución mejor por ahí?

Saludos,

Respuesta

25

Después de días de la piratería de hardcore fin he conseguido para construir una solución tan avanzado que en realidad podría perjudicar a leerlo. Coloco un ImageView con el fondo detrás de scrollview, y establezco scaleType = "matrix" para que no se contraiga 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> 
+1

No podemos poner la matriz como un tipo de escala, que afecta a la imagen de escala de propiedad, mientras que en mi caso necesito fitCenter. –

7

No puedo comentar sobre 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 hasta la parte inferior de la vista). Tengo una situación similar con un gran cuadro desplegable EditText. Cuando aparece el teclado suave no me gusta que mi fondo quede aplastado.

He tratado de su solución y mientras que a primera vista parece funcionar, hay algunas situaciones en las que podría no ser ideal:

  1. Si usted permite que su aplicación el tener un modo de paisaje, el fondo no cambia de tamaño/estiramiento
  2. Si ejecuta su aplicación en un dispositivo con una pantalla más grande o dpi, sus antecedentes no puede llenar la pantalla

Básicamente, parece que cuando se establece el scaleType a matrix eres t Elling Android para dibujar el fondo 1: 1 y no a escala. Entonces, ¿qué sucede cuando abre el teclado virtual utilizando su solución? scrollView y imageView están cambiando de tamaño como de costumbre, pero la imagen que estableció sigue siendo 1: 1 y continúa mostrando la misma área.

Así que si, por ejemplo, su imagen de fondo se configuró en un tamaño específico (por ejemplo, 480 x 800) y rellena perfectamente su Nexus One, en el momento que gire hacia el paisaje tendrá un área negra a la derecha.

Esto es discutible, por supuesto, si su fondo es simplemente un patrón repetitivo, 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 para tratar de resolver esto, me encontré con un atributo View llamado android:isScrollContainer. Este atributo le dice a ciertas vistas si pueden o no cambiar el tamaño al mostrar el teclado virtual. Esto también lo menciona alguien en su solución vinculada.He intentado configurar esto (a falso) en el ViewGroup que contiene mi fondo, pero cualquier elemento secundario que se desplaza parece anularlo, lo que provoca el aplastamiento de nuevo.

En este momento no creo que haya una solución completa para nuestra situación. Tu definitivamente funciona en algunos casos y te agradezco el esfuerzo. Es de esperar que Google ofrezca una solución en el futuro, pero no creo que lo consideren un problema/prioridad.

30

De hecho, me encontré con un problema similar no hace mucho tiempo. Me encontré con la respuesta correcta con un poco de trabajo, sin embargo.

En su manifiesto de Android para este proyecto, adjuntado 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á el tamaño sí para encajar el teclado en pantalla, y stateVisible significa que el teclado en pantalla mostrará cuando se le solicite (esto puede ser stateAlwaysVisible, etc, si es necesario)

fuente: Android Dev for Activity tags

+8

Esto no resuelve el problema del OP. Menciona específicamente que esta solución no funciona para su caso porque necesita que se vea/acceda la parte inferior de su 'scrollview'. Imagine que intenta escribir un mensaje largo sin poder ver lo que está escribiendo después de algunas líneas. Con esta solución, dado que la actividad no se redimensionará, faltarán las últimas líneas ya que están ocultas detrás del teclado. –

21

Puede usar la propiedad windowBackground, que hace que el dibujable se ajuste a toda la pantalla. para hacer eso es necesario:

1- Crear un estilo:

<style name="Background" parent="@android:style/Theme.NoTitleBar"> 
    <item name="android:windowBackground">@drawable/you_bg_drawable</item> 
</style> 

2- Establecer el estilo de su actividad en el AndroidManifest.xml

<activity 
    android:name=".ui.your_activity" 
    android:theme="@style/Background"/> 
+2

Parece la mejor solución, gracias. Funciona bien para mí. – ernazm

+0

Este realmente funcionó para mí sin ningún efecto secundario. ¡Gracias! – myforums

+0

funcionando bien, gracias! – mrmamon

8

que estaba buscando en Google para una solución a este problema exacto cuando me enteré de esto, y después de hacer una investigación encontré una solución que creo que es un poco mejor. En lugar de cortar con un ImageView puede utilizar esta información de su actividad:

 getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background); 

creo que sirve cualquier otra persona en busca de una solución para esto.

1

¿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 e insertarlo como fondo de ventana?

7

Tal vez hay otra solución (muy simple!): En styles.xml: crear un nuevo estilo de esta manera:

<style name="Yourstyle" parent="AppBaseTheme"> 
    <item name="android:windowBackground">@drawable/mybackground</item> 
</style> 

AppBaseTheme es su tema que se utiliza normalmente para su aplicación. Luego se agrega en Manifest.xml:

<activity 
    android:name="com.your.app.name.Activity" 
    android:theme="@style/Yourstyle"> 
</activity> 

Así que tienen el mismo estilo pero con un fondo.

Importante: ¡no establezca ningún fondo en su archivo .xml normal!

Es mi primer mensaje y espero que ayude y lo siento por mi inglés.

+1

Por lo tanto, su primera publicación es muy útil. – CoolMind

0

Después de mucho tiempo buscando ...

Deja android:windowSoftInputMode="adjustPan|stateVisible" en cada activitys

Cuestiones relacionadas