web-dev-qa-db-fra.com

Comment conserver la taille de l'image d'arrière-plan lorsque le clavier logiciel est affiché

Lorsque le clavier du logiciel s’affiche, il redimensionne ma mise en page et resserre ainsi l’image de fond. Ma question est fondamentalement une copie de cette question, qui s’explique très bien:

Le clavier logiciel redimensionne l'image d'arrière-plan sous Android

Cependant, cette question a été fermée quand ils ont trouvé un bidouillage pour la résoudre. Je ne peux pas utiliser ce hack. Toute ma mise en page se trouve à l'intérieur d'une ScrollView et je dois pouvoir utiliser cette vue à tout moment. En utilisant Android: windowSoftInputMode = "stateVisible | adjustPan", l'utilisateur ne pourra pas faire défiler l'écran et voir le bas de l'écran pendant l'affichage du clavier, car la disposition existera partiellement derrière le clavier. Ainsi, la solution est inacceptable pour moi. Existe-t-il de meilleures solutions?

À votre santé,

22
pgsandstrom

Après des jours de piratage hardcore, j’ai finalement réussi à construire une solution si avancée qu’il pouvait être douloureux de la lire. Je place un ImageView avec l'arrière-plan derrière la vue de défilement et définit scaleType = "matrix" afin qu'il ne soit pas réduit lorsque le clavier est affiché.

<?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>
27
pgsandstrom

En fait, j'ai rencontré un problème similaire il n'y a pas si longtemps. Je suis tombé sur la bonne réponse avec un peu de travail, cependant.

Dans le manifeste Android associé à l'activité que vous utilisez pour ce projet, utilisez la ligne Android:windowSoftInputMode="adjustPan|stateVisible" dans la balise d'activité.

adjustPan signifie fondamentalement que votre activité ne se redimensionnera pas pour s'adapter au clavier virtuel, et stateVisible signifie que le clavier virtuel s'affichera à la demande (cela peut être stateAlwaysVisible, etc. si nécessaire)

source: Développeur Android pour balises d'activité

31
syklon

Vous pouvez utiliser la propriété windowBackground, ce qui permet au dessin d'être ajusté à tout l'écran. Pour ce faire, vous devez:

1- Créer un style:

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

2- Définissez votre style d'activité dans le fichier AndroidManifest.xml

<activity
    Android:name=".ui.your_activity"
    Android:theme="@style/Background"/>
21
aglour

Lorsque je suis tombé sur Google, je cherchais une solution à ce problème précis et, après quelques recherches, j'ai trouvé une solution légèrement meilleure. Au lieu de pirater avec un ImageView, vous pouvez utiliser ceci à partir de votre activité:

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

J'espère que cela aidera toute autre personne à la recherche d'une solution à ce problème.

8
John Nilsen

Peut-être existe-t-il une autre solution (très simple!): Dans styles.xml: Créez un nouveau style comme celui-ci:

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

AppBaseTheme est votre thème normalement utilisé pour votre application. Ensuite, vous ajoutez dans Manifest.xml:

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

Donc, vous avez le même style mais avec un fond.

Important: ne définissez aucun arrière-plan dans votre fichier .xml normal!

C'est mon premier post et j'espère que cela m'aide et que je suis désolé pour mon anglais.

7
stefan96

Je ne peux pas commenter votre réponse, mais j'aimerais ajouter quelque chose.

Je comprends votre dilemme et la raison pour laquelle la solution à laquelle vous êtes lié n’est pas une solution complète pour votre situation (car vous ne pouvez pas faire défiler vers le bas de la vue). J'ai une situation similaire avec une grande boîte EditText défilement. Lorsque le clavier logiciel apparaît, je n'aime pas que mon arrière-plan soit écrasé.

J'ai essayé votre solution et si, à première vue, elle semble fonctionner, il existe des situations dans lesquelles elle pourrait ne pas être idéale:

  1. Si vous autorisez votre application à avoir un mode paysage, l’arrière-plan ne sera pas redimensionné/étiré
  2. Si vous exécutez votre application sur un appareil doté d'un écran plus grand ou de ppp, votre arrière-plan risque de ne pas remplir l'écran.

En gros, il semble que lorsque vous définissez la variable scaleType sur matrix, vous demandez à Android de dessiner l'arrière-plan 1: 1 et non de le redimensionner. Donc, ce qui se passe lorsque vous ouvrez le clavier logiciel avec votre solution, votre scrollView et imageView sont tous redimensionnés comme d'habitude, mais l'image src que vous avez définie reste 1: 1 et continue ainsi d'afficher la même zone.

Ainsi, si, par exemple, votre image d'arrière-plan était définie sur une taille spécifique (par exemple, 480 x 800) et qu'elle remplissait parfaitement votre Nexus One, dès que vous passez en mode paysage, vous verrez une zone noire à droite.

Bien entendu, si le fond est un motif répétitif, vous pouvez le rendre extrêmement volumineux et compenser, espérons-le, pour différents écrans (peut-être même des tablettes).

Ou vous pouvez également fournir différents arrière-plans pour différentes tailles/densités/orientations d'écran, mais cela ne tient toujours pas compte de la mise à l'échelle.

Dans un effort vain pour essayer de résoudre ce problème, je suis tombé sur un attribut View appelé Android:isScrollContainer . Cet attribut indique à certaines vues si elles sont autorisées ou non à redimensionner lors de l'affichage du clavier logiciel. Ceci est également mentionné par quelqu'un dans votre solution liée. J'ai essayé de définir ceci (sur false) sur la variable ViewGroup contenant mon arrière-plan, mais tout élément enfant qui défile semble le remplacer, ce qui provoque à nouveau la compression.

Pour l'instant, je ne pense pas qu'il existe une solution complète à notre situation. Votre fonctionne certainement dans certains cas et je vous remercie pour l'effort. Espérons que Google offrira une solution à l'avenir, mais je ne pense pas qu'ils considéreraient cela comme un problème/une priorité.

7
Tony Chan

dans Androidmanifest dans l'utilisation des balises d'activité:

<activity ... Android:windowSoftInputMode="adjustPan" ></activity>

check Référence développeur Android

6
xhandros

Que diriez-vous d'une solution où le «fond» est une mise en page. Pouvons-nous gonfler une mise en page, en faire toute la taille de la fenêtre, puis l'insérer en tant qu'arrière-plan de la fenêtre?

1
James Barwick

Après beaucoup de temps à chercher ...

Mettez Android:windowSoftInputMode="adjustPan|stateVisible" dans chaque activité

0
Erick Alves