web-dev-qa-db-fra.com

Ajouter une valeur à virgule flottante à Android ressources / valeurs

J'essaie d'ajouter un peu d'espace entre les lignes à mes TextViews en utilisant Android:lineSpacingMultiplier de la documentation :

Espacement supplémentaire entre les lignes de texte, en tant que multiplicateur.

Doit être une valeur à virgule flottante, telle que "1.2".

Comme je l'utilise dans quelques TextViews différents, j'aimerais ajouter une dimension/valeur globale à mes ressources, mais je ne sais pas quelle balise utiliser, même si elle existe. J'ai essayé tous les types de ressources qui ont un sens pour moi, mais aucun d'entre eux ne fonctionne.

Ce que j'aimerais avoir serait quelque chose comme ceci:

<resources>
    <dimen name="text_line_spacing">1.4</dimen>
</resources>

Edit: Je suis au courant de Android:lineSpacingExtra (qui nécessite une dimension avec une unité ajoutée), mais j'aimerais utiliser Android:lineSpacingMultiplier si possible.

219
slup

Il y a une solution:

<resources>
    <item name="text_line_spacing" format="float" type="dimen">1.0</item>
</resources>

De cette façon, votre numéro de float sera sous @dimen. Notez que vous pouvez utiliser d'autres modificateurs de "format" et/ou de "type", où format signifie:

Format = type de données englobant:

  • float
  • booléen
  • fraction
  • entier
  • ...

et le type signifie:

Type = type de ressource (référencé avec R.XXXXX.name):

  • couleur
  • dimen
  • chaîne
  • style
  • etc...

Pour extraire une ressource du code, vous devez utiliser cet extrait:

TypedValue outValue = new TypedValue();
getResources().getValue(R.dimen.text_line_spacing, outValue, true);
float value = outValue.getFloat();  

Je sais que c'est déroutant (vous vous attendez à un appel comme getResources().getDimension(R.dimen.text_line_spacing)), mais Android dimensions a un traitement spécial et le nombre pur "float" n'est pas dimension valide.


De plus, il y a un petit "bidouillage" pour mettre un nombre à virgule dans la dimension, mais soyez AVERTI que c'est vraiment bidouiller, et vous courent le risque de perdre la plage de flottaison et la précision.

<resources>
    <dimen name="text_line_spacing">2.025px</dimen>
</resources>

et à partir du code, vous pouvez obtenir ce float par

float lineSpacing = getResources().getDimension(R.dimen.text_line_spacing);

dans ce cas, la valeur de lineSpacing est 2.024993896484375, et non 2.025 comme prévu.

480
Tomo

Comme décrit dans ce lien http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html

Déclarer dans dimen.xml

<item name="my_float_value" type="dimen" format="float">9.52</item>

Référencement à partir de XML

@dimen/my_float_value

Référencement à partir de Java

TypedValue typedValue = new TypedValue();
getResources().getValue(R.dimen.my_float_value, typedValue, true);
float myFloatValue = typedValue.getFloat();
76
yajnesh

Toutes les solutions vous suggèrent d'utiliser la valeur prédéfinie float par le biais du code.

Mais si vous vous demandez comment référencer la valeur float prédéfinie en XML (par exemple, les présentations), voici un exemple de ce que j'ai fait et cela fonctionne parfaitement:

Définissez les valeurs de ressource comme type="integer" mais format="float", par exemple:

<item name="windowWeightSum" type="integer" format="float">6.0</item>
<item name="windowNavPaneSum" type="integer" format="float">1.5</item>
<item name="windowContentPaneSum" type="integer" format="float">4.5</item>

Et plus tard, utilisez-les dans votre mise en page avec @integer/name_of_resource, par exemple:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:weightSum="@integer/windowWeightSum"                 // float 6.0
    Android:orientation="horizontal">

    <LinearLayout
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:layout_weight="@integer/windowNavPaneSum"        // float 1.5
        Android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

    <LinearLayout
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:layout_weight="@integer/windowContentPaneSum"    // float 4.5
        Android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

</LinearLayout>
37
waqaslam

J'ai également trouvé une solution de contournement qui semble fonctionner correctement, sans aucun avertissement:

<resources>
    <item name="the_name" type="dimen">255%</item>
    <item name="another_name" type="dimen">15%</item>
</resources>

Ensuite:

// theName = 2.55f
float theName = getResources().getFraction(R.dimen.the_name, 1, 1);
// anotherName = 0.15f
float anotherName = getResources().getFraction(R.dimen.another_name, 1, 1);

Attention: cela ne fonctionne que lorsque vous utilisez le dimen de Java pas de xml

18
Cristian

Nous pouvons également l'utiliser pour la ligne directrice de la présentation de contrainte.

Créez un fichier integer.xml et ajoutez-le à

 <item name="guideline_button_top" type="integer" format="float">0.60</item>

Utiliser à partir d'un fichier layout.xml

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 
7
Photon Point

J'ai utilisé un style pour résoudre ce problème. Le lien officiel est ici .

Trucs assez utiles. Vous créez un fichier contenant vos styles (comme "styles.xml") et vous les définissez à l'intérieur. Vous faites ensuite référence aux styles de votre mise en page (comme "main.xml").

Voici un exemple de style qui fait ce que vous voulez:

<style name="text_line_spacing">
   <item name="Android:lineSpacingMultiplier">1.4</item>
</style>

Supposons que vous souhaitiez modifier une simple TextView avec ceci. Dans votre fichier de mise en page, vous tapez:

<TextView
   style="@style/summary_text"
   ...
   Android:text="This sentence has 1.4 times more spacing than normal."
/>

Essayez-le - c'est essentiellement ainsi que toute l'interface utilisateur intégrée est réalisée sur Android. Et en utilisant des styles, vous avez la possibilité de modifier toutes sortes d'autres aspects de vos vues.

5
Scott Biggs

Si vous contrôlez la plage de simples flottants, vous pouvez également avoir un entier dans les ressources et le diviser par le nombre de décimales dont vous avez besoin directement dans le code.

Donc quelque chose comme ça

<integer name="strokeWidth">356</integer>

est utilisé avec 2 décimales

this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);    
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);

et cela le fait .56f

Il ne s'agit pas de la solution la plus élégante, mais pour les projets simples, c'est pratique.

2
Thanasis Kapelonis

Ajoutez un float à dimens.xml:

<item format="float" name="my_dimen" type="dimen">1.2</item>

Pour référencer à partir de XML:

<EditText 
    Android:lineSpacingMultiplier="@dimen/my_dimen"
    ...

Pour lire cette valeur par programmation, vous pouvez utiliser ResourcesCompat.getFloat à partir de androidx.core

Dépendance Gradle:

implementation("androidx.core:core:${version}")

Usage:

import androidx.core.content.res.ResourcesCompat;

...

float value = ResourcesCompat.getFloat(context.getResources(), R.dimen.my_dimen);
0
Alex Baker

J'ai trouvé une solution qui fonctionne, mais aboutit à un Warning (WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a}) dans LogCat.

<resources>
    <string name="text_line_spacing">1.2</string>
</resources>

<Android:lineSpacingMultiplier="@string/text_line_spacing"/>
0
slup