web-dev-qa-db-fra.com

android comment changer <item> largeur et hauteur

Je fais un <layer-list> pour drawable. 

J'ai mon image de fond et je veux que la deuxième couche soit plus petite, Mais il semble que peu importe ce que j'écris dans mes Android:layer_width et Android:layer_height 

La taille de la seconde couche est toujours la même.

Voici mon xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <item
        Android:drawable="@drawable/picuser" 
        Android:layout_width="50dp"
        Android:layout_height="50dp" />

    <item
        Android:drawable="@drawable/ic_launcher" 
        Android:layout_width="10dp"
        Android:layout_height="10dp" />
</layer-list>
27
Asaf Nevo

J'espère que cela vous a mis dans la bonne direction:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:drawable="@drawable/picuser"/>

    <item>

        <bitmap
            Android:src="@drawable/ic_launcher"
            Android:gravity="center" />
    </item>
</layer-list>

Comme vous pouvez le voir ici , <item> n'a pas d'attribut layout_width/layout_height.

17
amp

C'est une sorte de solution de contournement, mais cela a fonctionné pour moi.
Vous pouvez utiliser un rembourrage pour rendre le second dessinable plus petit.

<item Android:drawable="@drawable/circyle" />

<item
    Android:drawable="@drawable/plus" 
    Android:top="10dp"
    Android:bottom="10dp"
    Android:right="10dp"
    Android:left="10dp" />

29
oznus

Contrairement à ce que quelqu'un a dit, il existe également des attributs de largeur et de hauteur pour <item>. Merci à @Entreco d'avoir posté une démonstration de cela.
Android:width et Android:height pour Drawables sont similaires à Android:layout_width et Android:layout_height pour Views, à la différence qu'ils ne peuvent pas être définis sur match_parent ni wrap_content, mais vous pouvez obtenir le même comportement de match_parent en définissant l'attribut Android:gravity sur left|right ou start|end largeur du parent) ou top|bottom (pour correspondre à la hauteur du parent).

Malheureusement, ces attributs ne sont disponibles que depuis API 23

Cependant, compte tenu de la méthode ci-dessus que j'ai suggérée à la place de match_parent et que les attributs Android:width et Android:height sont disponibles pour l'élément <size> (qui doit être placé dans un <shape>) sans aucune restriction d'API, vous pouvez utiliser une solution de contournement simple:

<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item>

        <shape
            Android:shape="rectangle">

            <size
                Android:width="152dp"
                Android:height="152dp"/>

            <solid
                Android:color="#00FFFFFF"/>
        </shape>
    </item>

    <item>

        <bitmap
            Android:gravity="left|right|top|bottom"
            Android:src="@mipmap/ic_launcher"/>
    </item>
</layer-list>

La solution ci-dessus tire parti d'un <item> de taille (avec un <shape> transparent) et d'un non dimensionné (avec un <bitmap>) pour lequel Android:gravity est défini sur left|top|right|bottom et qui correspond aux dimensions des deux parents. Ainsi, la taille réelle du <bitmap> sera déterminée par celle de l'unique <item> de taille unique du même parent.

MODIFIER:  

Merci à @Emil S, qui a remarqué que la solution ci-dessus ne fonctionnerait pas comme arrière-plan de fenêtre. Il ne fonctionne correctement que comme arrière-plan ou au premier plan d'une vue. Je ne connais pas de raison particulière à un comportement aussi étrange, mais je peux deviner qu'au moment où le système crée une fenêtre avec l'arrière-plan spécifié dans l'attribut Android:windowBackground, aucune mise en page n'est effectuée car aucun processus n'est encore lancé. Donc, Android finira par rastériser le dessinable à la taille de l'écran et l'étirera pour remplir toute la fenêtre, je pense. Cela expliquerait comment cela pourrait arriver.

MODIFIER:  

@ João Carlos a expliqué comment ma solution ne fonctionnerait pas (car elle provoquerait un héritage cyclique) lors de l'utilisation d'une icône adaptative (ces icônes constituées d'un arrière-plan et d'un premier plan, qui prennent en charge les dessinables vectoriels). Cependant, son propos n’a aucun sens, car les icônes adaptatives requièrent API 26: on pourrait utiliser directement Android:width et Android:height sur l’écran d’accueil ou quelque chose du genre (ils ont simplement besoin de API 23).
Donc, pour que quelque chose fonctionne dans toutes les versions d'Android, vous devrez différencier deux dessinables, le premier pour API <23, en utilisant la solution que j'ai publiée et le dernier pour API> = 23, en utilisant les deux attributs comme je l'ai dit il y a quelques lignes de texte.

8
Davide Cannizzo

À partir du niveau 23 et supérieur de l’API, vous pouvez définir la largeur et la hauteur d’un élément.

<item
    Android:drawable="@drawable/splash_logo"
    Android:height="100dp"
    Android:width="100dp"/>

NOTE: Utilisez Android:width et Android:height au lieu de Android:layout_width et Android:layout_height

7
Entreco

J'ai beaucoup essayé, mais je ne trouvais pas de moyen fiable de centrer le logo dans une présentation XML ..__ Enfin, j'ai trouvé la solution de contournement suivante:

mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ImageView imageView = (ImageView)mToolbar.findViewById(R.id.logo);
            if (mToolbar == null)
                return;
            int toolbarWidth = mToolbar.getWidth();
            int imageWidth = imageView.getWidth();
            imageView.setX((toolbarWidth - imageWidth) / 2);
        }
    });

layout_toolbar.xml:

<Android.support.v7.widget.Toolbar 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    style="@style/Toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="@dimen/toolbar_height"                                                                   
    Android:background="@drawable/toolbar_background"
    Android:focusable="false"                                
    app:titleTextAppearance="@style/AppTheme.Toolbar.Title">

    <ImageView
        Android:id="@+id/logo"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/toolbar_logo" />
</Android.support.v7.widget.Toolbar>
2
User9527

Essaye ça:

<?xml version="1.0" encoding="utf-8"?>
<!-- The Android:opacity=”opaque” line is critical in preventing a flash 
of black as your theme transitions. -->
<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:opacity="opaque">

    <!-- The background color, preferably the same as your normal theme -->
    <item Android:drawable="@Android:color/white" />

    <item
        Android:height="100dp"
        Android:width="100dp"
        Android:gravity="center">

        <bitmap
            Android:src="@drawable/ic_launcher_bc_512"/>
    </item>
</layer-list>
0
Jupiter