Android Drawable: spécifier la largeur de la forme en pourcentage dans le fichier XML?

j'essaie de créer un simple Drawable que je veux mettre comme arrière-plan pour une vue (en utilisant setBackgroundDrawable ). Je veux simplement diviser le fond du tirable en 2 rectangles égaux (50% - 50%), le premier vouloir rempli de noir, le second avec blanc:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/back_color_1">
        <shape android:shape="rectangle">
          <solid android:color="#000000" />
        </shape>
    </item>
    <item android:id="@+id/back_color_2">
        <shape android:shape="rectangle">
          <solid android:color="#FFFFFF" />
        </shape>
    </item>
</layer-list>

Comment puis-je spécifier que chaque forme doit avoir une largeur de 50% dans le fichier de définition XML étirable? Quelque chose comme android: width= " 50%" .

(je travaille sur Android 3.0, mais je pense que c'est une question générale Android.)

P. S: Vous pouvez le faire en CSS ou XAML.

22
demandé sur Draško Kokić 2011-05-19 19:52:37

5 réponses

vous ne pouvez pas spécifier un pourcentage . Vous devez spécifier une valeur de Dimension.

android:width est défini ici: http://developer.android.com/reference/android/R.attr.html#width :

(l'emphase est mienne)

Doit être une valeur de dimension , qui est un nombre à virgule flottante ajouté avec une unité telle que "14.5 sp". Les unités disponibles sont: px (pixels), dp (indépendante de la densité de pixels), sp (mise à l'échelle des pixels en fonction préférée pour la taille de la police), en (pouces) mm (millimètres).

pour une définition de chaque type de dimension, voir: http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

vous devrez créer votre propre attribut (voir styleable ) et effectuer vous-même les calculs dans onDraw(...) .

voir ces deux questions et les liens qui s'y trouvent pour des exemples:

10
répondu Aleadam 2017-05-23 12:17:42

android:layout_weight=".20" est la meilleure façon de mettre en pourcentage

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/logTextBox"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight=".20"
    android:maxLines="500"
    android:scrollbars="vertical"
    android:singleLine="false"
    android:text="@string/logText" >
</TextView>

</LinearLayout>
5
répondu Swapnil Kotwal 2013-03-04 09:20:36

il n'y a pas de vrai réglage de pourcentage, mais vous pourriez vous rapprocher.

il semble que la façon la plus facile d'y parvenir est d'utiliser une image comme fond de dessin et juste faire une image en noir et blanc.

la seule autre façon que je sais de diviser quoi que ce soit est d'utiliser 2 vues, chacune avec sa propre couleur bg, et chaque donné la même valeur positive pour android:layout_weight attribut (ie. 50/50). ils seront alors diviser l'espace disponible.

espérons que cette aide!

3
répondu chris 2011-05-19 16:11:16

la façon dont j'ai trouvé à faire ceci était en créant ma propre classe héritant de RelativeLayout, où je surpasse la méthode onMeasure. À ce stade, la hauteur de la vue est connu, donc je suis allé chercher le fond, et régler manuellement l'insertion des éléments en utilisant setLayerInset .

    LayerDrawable bg = (LayerDrawable)getBackground();
    int h = getMeasuredHeight();
    bg.setLayerInset(1, 0, 0, 0, h/2);

Cette méthode est un peu lourd. Dans la plupart des cas, la réponse fournie par chris devrait être suffisant.

2
répondu Skymt 2011-10-11 14:08:33

la meilleure façon comme swapnil déclaré, est d'utiliser layout_weight dans une LinearLayout. Si vous allez horizontalement, définissez layout_width à "fill_parent" puis définissez layout_weight à un pourcentage que vous voulez. Commencez par quelque chose comme ci-dessous et jouez avec les valeurs layout_width pour en avoir une idée (ou ajoutez plus de vues juste pour avoir une meilleure compréhension).

<LinearLayout    
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation = "horizontal" >

    <View
      android:layout_width="fill_parent"
      android:layout_height="30dip"
      android:layout_weight="0.5"
      android:background="#aaffaa" />
    <View
      android:layout_width="fill_parent"
      android:layout_height="30dip"
      android:layout_weight="0.5"
      android:background="#aaaaff" />
</LinearLayout>
1
répondu ajacian81 2013-07-03 16:01:43