264 votes

Ajouter une valeur en virgule flottante aux ressources / valeurs Android

Je suis d'essayer d'ajouter un peu d'espace entre les lignes de mon TextViews l'aide d' android:lineSpacingMultiplier à partir de la documentation:

L'espacement entre les lignes de texte, comme un multiplicateur.

Doit être une valeur à virgule flottante, par exemple "1.2".

Comme je suis en utilisant ce dans différents TextViews je voudrais ajouter une dimension mondiale/valeur à mes ressources, mais je ne sais pas quelle est la balise à utiliser, même s'il existe. J'ai essayé tous les types de ressources qui ont du sens pour moi, mais aucun d'entre eux travaille.

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

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

Edit: je suis conscient de l' android:lineSpacingExtra (qui a besoin d'une dimension avec un ajouté unité), mais je voudrais utiliser android:lineSpacingMultiplier si possible.

560voto

Tomo Points 1764

Il y a une solution:

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

De cette façon, votre nombre à virgule sera sous @dimen. Notez que vous pouvez utiliser d'autres "format" et/ou "type" modificateurs, où le format est synonyme de:

Format = enfermant type de données:

  • flotteur
  • boolean
  • fraction
  • entier
  • ...

et le type est synonyme de:

Type = type de ressource (en référence à R. XXXXX.nom):

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

Pour aller chercher des ressources à partir 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 ceci est source de confusion (que vous attendez d'appel comme getResources().getDimension(R.dimen.text_line_spacing)), mais Android dimensions ont un traitement spécial et pure "flotter" le numéro n'est pas valide dimension.


En outre, il y a un petit "hack" de mettre de nombre à virgule en dimension, mais soyez AVERTI que c'est vraiment de la bidouille, et vous risquer de chance de perdre flotteur de gamme et de précision.

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

et à partir du code, vous pouvez obtenir qui flottent par

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

dans ce cas, la valeur de lineSpacing est 2.024993896484375, et pas 2.025 comme vous serait attendu.

88voto

yajnesh Points 760

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

Déclarez 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 de Java

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

49voto

waqaslam Points 31012

Toutes les solutions vous suggèrent d'utiliser la valeur de flottement prédéfinie via le code.

Mais si vous vous demandez comment référencer la valeur flottante prédéfinie dans XML (par exemple, les mises en page), voici un exemple de ce que j'ai fait et de son fonctionnement parfait:

Définissez les valeurs de ressource en 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 en utilisant @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>
 

19voto

Cristian Points 92147

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

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

Alors:

 // 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);
 

5voto

Scott Biggs Points 958

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

De jolies choses utiles. Vous faites un fichier pour vos styles (comme "styles.xml"), et de le définir à l'intérieur. Vous ensuite de référence les styles dans 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>

Disons que vous voulez modifier une simple TextView avec cette. Dans votre fichier de mise en page vous auriez du type:

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

Essayez de lui--c'est essentiellement la façon dont tous les construit-dans l'INTERFACE utilisateur se fait sur android.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X