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.
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:
et le type signifie:
Type = type de ressource (référencé avec R.XXXXX.name):
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.
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();
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>
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
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"
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.
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.
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);
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"/>