web-dev-qa-db-fra.com

Android: redimensionnement de l'image d'arrière-plan sur le clavier

Je développe une application dans laquelle l'image d'arrière-plan se rétrécit sur la fenêtre contextuelle du clavier. Mon .xml est le suivant:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:facebook="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@drawable/background" >

    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" >

        <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" >

            /**
              Other stuff 
            */

        </RelativeLayout>
    </ScrollView>
</RelativeLayout>

J'ai cherché sur Google et j'ai trouvé que, pour ajouter

Android:windowSoftInputMode="stateVisible|adjustPan"

dans mon fichier manifeste. Mais ce n'est d'aucune utilité.

Modifier:

Ma disposition avant l'apparition du clavier s'affiche:

Image 1

Et après pop up comme:

Image 2

Veuillez vérifier la différence dans l'image d'arrière-plan. Dans l'image 1, l'image est de taille et dans l'image 2, l'image d'arrière-plan est rétrécie. J'ai besoin que le pied de page et l'arrière-plan soient déplacés vers le haut dans la fenêtre contextuelle du clavier.

Ce que je manque ou fais mal, suggérez-moi.

31
Manoj Fegde

Utilisez simplement dans votre onCreate() ce code:

protected void onCreate(Bundle savedInstanceState) {
...   
 getWindow().setBackgroundDrawableResource(R.drawable.your_image_resource);
...
}

et supprimez cette ligne dans votre xml:

Android:background="@drawable/background"

Lire la suite sur:

http://developer.Android.com/reference/Android/view/Window.html

34

J'avais déjà rencontré le problème similaire une fois, le mien a été résolu en utilisant les propriétés ci-dessous dans le manifeste, utilisez-le là où votre activité est déclarée.

 Android:windowSoftInputMode="stateHidden|adjustResize|adjustPan"
10
mushahid

Ok si j'ai bien répondu à votre question, vous voulez une mise en page avec un arrière-plan et une vue de défilement. Et lorsque le clavier tactile apparaît, vous souhaitez redimensionner la vue de défilement, mais conserver l'arrière-plan en taille réelle, n'est-ce pas? si c'est ce que vous voulez, j'aurais peut-être trouvé une solution à ce problème:

Ce que vous pouvez faire, c'est faire 2 activités.

Activité 1:

public class StartActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent StartApp = new Intent(this, DialogActivity.class);
    startActivity(StartApp);         // Launch your official (dialog) Activity

    setContentView(R.layout.start);  // your layout with only the background 
    }
}

Activité2:

public class DialogActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  // get rid of dimming
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);  //get rid of title bar (if you want)

    setContentView(R.layout.dialog);  //Dialog Layout with scrollview and stuff

    Drawable d = new ColorDrawable(Color.BLACK);  //make dialog transparent
    d.setAlpha(0);
    getWindow().setBackgroundDrawable(d);
    }
}

commencer la mise en page:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical" 
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@drawable/test">  //your background
</LinearLayout>

disposition de la boîte de dialogue:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">

    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

            <LinearLayout
                Android:orientation="vertical"     
                Android:layout_width="match_parent"
                Android:layout_height="match_parent">

                <!-- All your Scrollview Items -->

            </LinearLayout>
     </ScrollView>
</RelativeLayout>

AndroidManifest.xml

commencer l'activité:

Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen">

activité de dialogue

Android:theme="@Android:style/Theme.Dialog"
Android:windowSoftInputMode="adjustResize"
Android:excludeFromRecents="true"

Edit: Pour terminer les activités en même temps, utilisez ce qui suit quelque part dans votre DialogActivity (exemple: remplacez le bouton de retour):

@Override
public void onBackPressed() {
    Intent intent = new Intent(getApplicationContext(), StartActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("EXIT", true);
    startActivity(intent);
}

et dans onCreate() de StartActivity:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}
else {
    Intent StartApp = new Intent(this, TestActivity.class);
    startActivity(StartApp);
}

Captures d'écran!

Normal Normal

Cliquez sur la case EditText Clicked textbox

Après défilement vers le bas (ps: j'ai mis la zone de texte à l'intérieur de scrollview c'est pourquoi c'est parti;)) after scrolled down

J'espère que cela vous aidera;)

7
Strider

Hé, pouvez-vous essayer d'ajouter ceci

Android:isScrollContainer="false" 

dans votre ScrollView. Il a résolu mon problème une fois. Ça pourrait vous aider aussi.

Ajoutez également ceci à votre activité dans manifest.xml

Android:windowSoftInputMode="adjustPan"

J'espère que cela aide..!! :)

6
iMDroid

J'ai eu le même problème.

Ajoutez votre arrière-plan de mise en page externe à l'intérieur de la méthode onCreate comme indiqué ci-dessous

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

et ajoutez votre disposition extérieure comme

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
>
<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="#4d000000"
    ><other code></ScrollView></RelativeLayout>

Ajouter Android:layout_weight="1" pour la mise en page externe et ne définissez pas l'arrière-plan dans le fichier xml Je pense que cela aide quelqu'un

6
R.Anjali

Vous devez déplacer le Android:background="@drawable/background" dans un ImageView au-dessus de ScrollView. Lorsque le clavier apparaît, il réduit efficacement l'écran et, ayant une image en arrière-plan, vous n'avez aucun contrôle sur la façon dont il est redimensionné/rogné. Donc, en supposant que vous souhaitiez que l'image soit pleine largeur mais que vous gardiez le rapport d'aspect, essayez ceci:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:facebook="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:src="@drawable/background"
        Android:scaleType="centerCrop" />

    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" >
        <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" >           
            /**
            Other stuff
            */
        </RelativeLayout>
    </ScrollView>
</RelativeLayout>

Vous pouvez essayer différents Android:scaleType valeurs pour obtenir l'effet souhaité. Si vous souhaitez que l'image soit recadrée du haut au lieu du recadrage moyen par défaut, consultez ici sur la façon d'y parvenir, ou essayez d'utiliser la bibliothèque this

3
Evripidis Drakos

Vérifiez cette réponse , l'astuce de base est que vous ne définissez pas l'arrière-plan sur la mise en page mais sur la fenêtre. Cela peut être fait à partir de l'activité avec getWindow().setBackgroundDrawable(), ou vous pouvez le définir dans un thème pour votre activité.

1
Lamorak

Utilisez ScrollView comme parent supérieur. Il défilera automatiquement de haut en bas lorsque vous ouvrirez et fermerez le clavier.

0
Mohit Rajput

Au lieu de Android:windowSoftInputMode="stateVisible|adjustPan", vous devez passer à Android:windowSoftInputMode="stateVisible|adjustResize". Ça a marché pour moi.

0
Optimus NTL

Pourquoi tu n'aimes pas ça

    <ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"

        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:fillViewport="true"
        Android:focusable="true"
        Android:background="@drawable/background"
        Android:focusableInTouchMode="true">

        <RelativeLayout
            Android:id="@+id/relative"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:focusable="true"
            Android:focusableInTouchMode="true"
    /**
              Other stuff 
            */
    >
  </RelativeLayout>
  </ScrollView>
0
Soham