Clavier logiciel redimensionne l’image d’arrière-plan sur Android

Chaque fois que le clavier logiciel apparaît, il redimensionne l’image d’arrière-plan. Reportez-vous à la capture d’écran ci-dessous:

Comme vous pouvez le voir, le fond est en quelque sorte coincé. Quelqu’un peut-il expliquer pourquoi l’arrière-plan est redimensionné?

Ma mise en page est la suivante:

   

Ok j’ai corrigé en utilisant

 android:windowSoftInputMode="stateVisible|adjustPan" 

entrée dans la dans le fichier manifest . Je pense que cela a été causé par la présence de ScrollView dans l’activité.

J’ai rencontré le même problème en développant une application de chat, un écran de discussion avec une image de fond. android:windowSoftInputMode="adjustResize" compressé mon image d’arrière-plan pour s’adapter à l’espace disponible après l’affichage du clavier logiciel et “adjustPan” a déplacé la mise en page complète pour ajuster le clavier logiciel. La solution à ce problème consistait à définir l’arrière-plan de la fenêtre au lieu d’un arrière-plan de présentation dans une activité XML. Utilisez getWindow().setBackgroundDrawable() dans votre activité.

Voici la meilleure solution pour éviter ce genre de problème.

Étape 1: Créer un style

  

Étape 2: AndroidManifest votre style d’activité dans le fichier AndroidManifest

  

Grâce à Android: windowSoftInputMode = “adjustPan” donnant une mauvaise expérience utilisateur parce que tout cet écran passe en haut (décaler vers le haut) Donc, suivre est l’une des meilleures réponses.

J’ai le même problème mais après, j’ai trouvé des réponses géniales du @Gem

En manifeste

 android:windowSoftInputMode="adjustResize|stateAlwaysHidden" 

En xml

Ne définissez aucun arrière-plan ici et gardez votre vue sous ScrollView

En java

Vous devez définir l’arrière-plan de la fenêtre:

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

Merci à @Gem.

juste pour plus …

Si vous avez une vue de liste sur votre activité, vous devez append cet android:isScrollContainer="false" dans vos propriétés de listview …

et n’oubliez pas d’append android:windowSoftInputMode="adjustPan" dans votre android:windowSoftInputMode="adjustPan" XML manifeste à votre activité …

Si vous utilisez android:windowSoftInputMode="adjustUnspecified" avec une vue déroulante sur votre mise en page, votre arrière-plan sera toujours redimensionné par le clavier logiciel …

il serait préférable d’utiliser la valeur “adjustPan” pour empêcher le redimensionnement de votre arrière-plan …

J’ai rencontré le problème principal lorsque je travaillais sur mon application. Au début, j’utilise la méthode fournie par @parulb pour résoudre le problème. Merci beaucoup. Mais plus tard, j’ai remarqué que l’image d’arrière-plan est partiellement masquée par la barre d’action (et la barre d’état, j’en suis sûr). Ce petit problème est déjà proposé par @ zgc7009 qui a commenté ci-dessous la réponse de @parulb il y a un an et demi, mais personne n’a répondu.

J’ai travaillé toute une journée pour trouver un moyen et heureusement, je peux au moins résoudre ce problème parfaitement sur mon téléphone portable maintenant.

Tout d’abord, nous avons besoin d’une ressource de liste de calques dans un dossier pouvant être dessiné pour append un remplissage en haut de l’image d’arrière-plan:

  < ?xml version="1.0" encoding="utf-8"?>      

Deuxièmement, nous définissons ce fichier comme ressource pour le fond comme mentionné ci-dessus:

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

J’utilise Nexus 5. J’ai trouvé un moyen d’obtenir la hauteur de la barre d’action dans XML, mais pas dans la barre d’état. Je dois donc utiliser une hauteur fixe de 75dp pour le remplissage supérieur. J’espère que tout le monde pourra trouver le dernier morceau de ce puzzle.

Si quelqu’un a besoin d’un comportement adjustResize et ne veut pas que son ImageView soit redimensionné, voici une autre solution.

Il suffit de mettre ScrollView dans ScrollView => RelativeLayout avec ScrollView.fillViewport = true .

        

Ajoutez cette ligne dans le fichier AndroidManifest.xml :

 android:windowSoftInputMode=adjustUnspecified 

reportez-vous à ce lien pour plus d’informations.

J’ai souffert de problèmes similaires, mais il semble que adjustPan avec android:isScrollContainer="false" n’a toujours pas corrigé ma mise en page (qui était un RecyclerView sous LinearLayout). Le RecyclerView était correct, mais chaque fois que le clavier virtuel apparaissait, le LinearLayout était réajusté.

Pour éviter ce comportement (je voulais simplement que le clavier passe sur ma mise en page), je suis allé avec le code suivant:

   

Cela dit à Android de laisser votre mise en page seule lorsque le clavier virtuel est appelé.

Plus d’informations sur les options possibles peuvent être trouvées ici (même si, curieusement, il ne semble pas y avoir une entrée pour adjustNothing ).

J’ai été confronté au même message et aucune solution ne m’a satisfait car j’ai utilisé fragment comme couche au-dessus d’un autre fragment, donc getActivity().getWindow().setBackgroundDrawable() n’a pas fonctionné pour moi. Ma solution consistait à remplacer FrameLayout par une logique permettant de gérer l’affichage du clavier et de modifier le bitmap lors de ses déplacements. C’est mon FrameLayout (kotlin):

`class FlexibleFrameLayout: FrameLayout {

 var backgroundImage: Drawable? = null set(bitmap) { field = bitmap invalidate() } private var keyboardHeight: Int = 0 private var isKbOpen = false private var actualHeight = 0 constructor(context: Context) : super(context) { init() } constructor(context: Context, atsortingbuteSet: AtsortingbuteSet) : super(context, atsortingbuteSet) { init() } fun init() { setWillNotDraw(false) } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val height = MeasureSpec.getSize(heightMeasureSpec) if (actualHeight == 0) { actualHeight = height return } //kb detected if (actualHeight - height > 100 && keyboardHeight == 0) { keyboardHeight = actualHeight - height isKbOpen = true } if (actualHeight - height < 50 && keyboardHeight != 0) { isKbOpen = false } if (height != actualHeight) { invalidate() } } override fun onDraw(canvas: Canvas) { if (backgroundImage != null) { if (backgroundImage is ColorDrawable) { backgroundImage!!.setBounds(0, 0, measuredWidth, measuredHeight) backgroundImage!!.draw(canvas) } else if (backgroundImage is BitmapDrawable) { val scale = measuredWidth.toFloat() / backgroundImage!!.intrinsicWidth.toFloat() val width = Math.ceil((backgroundImage!!.intrinsicWidth * scale).toDouble()).toInt() val height = Math.ceil((backgroundImage!!.intrinsicHeight * scale).toDouble()).toInt() val kb = if (isKbOpen) keyboardHeight else 0 backgroundImage!!.setBounds(0, 0, width, height) backgroundImage!!.draw(canvas) } } else { super.onDraw(canvas) } } 

} `

Puis je l'ai utilisé comme un FrameLayout habituel et dans mon fragment appelé frameLayout.backgroundImage = Drawable.createFromPath(path)

J'espère que cela aide

Ajoutez simplement votre activité

 getWindow().setBackgroundDrawable(R.drawable.your_image_name);