Androidリソース/値に浮動小数点値を追加する


243

ドキュメントandroid:lineSpacingMultiplier から使用して、TextViewsの行間に小さなスペースを追加しようとしています

乗数として、テキストの行間の余分なスペース。

「1.2」などの浮動小数点値でなければなりません。

これをいくつかの異なるTextViewで使用しているので、グローバルディメンション/値をリソースに追加したいのですが、使用するタグが存在する場合でも、それがわかりません。私には意味のあるすべての種類のリソースを試しましたが、どれも機能しません。

私が欲しいのは次のようなものです:

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

編集:私は承知してandroid:lineSpacingExtraいます(これには単位が追加されたディメンションが必要です)が、android:lineSpacingMultiplier可能であれば使用したいと思います。

回答:


517

解決策があります:

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

このようにして、浮動小数点数は@dimenの下になります。他の「フォーマット」や「タイプ」修飾子を使用できることに注意してください。

形式=囲んでいるデータ型:

  • 浮く
  • ブール
  • 分数
  • 整数
  • ...

そしてタイプは以下を意味します:

タイプ=リソースタイプ(R.XXXXX.nameで参照):

  • 次元
  • ストリング
  • スタイル
  • 等...

コードからリソースを取得するには、次のスニペットを使用する必要があります。

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

これは紛らわしいことを知っていますが(のような呼び出しを期待しますgetResources().getDimension(R.dimen.text_line_spacing))、Androidにdimensionsは特別な扱いがあり、純粋な "float"数は有効な次元ではありません。


さらに、浮動小数点数を次元に入れるための小さな「ハック」がありますが、これは実際にはハックであり、浮動小数点の範囲と精度を失う可能性があることを警告しています。

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

そしてコードから、あなたはそれによって浮動小数点数を得ることができます

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

この場合、の値はでlineSpacingあり2.0249938964843752.025予想どおりではありません。


2
これを使用してみましたが、コードから値を取得するときに、「タイプ#0x04は無効です」というNotFoundExceptionが発生しました。
Moises Jimenez

問題についてより具体的に説明できますか?おそらく、フォーマットに間違ったデータ型を使用した可能性があります...
Tomo

19
このXMLを使用し、XMLから山車を取得する@rodkarom:<item type="string" format="float" name="my_float">0.5</item>それを取得するには、このコード:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
gregn3

1
@ gregn3単に<string>タグでそれを行うことはできませんか?
pablisco 2014

4
ハックっぽい部分は削除した方がいいと思います。
Mathijs Segers、2015


43

すべてのソリューションは、コードを通じて事前定義された浮動小数点値を使用することをお勧めします。

しかし、XMLで事前定義されたfloat値(たとえば、レイアウト)を参照する方法について疑問がある場合は、次の例を使用して、完全に機能します。

リソース値をとして定義しtype="integer"たがformat="float"、例えば:

<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>

後で@integer/name_of_resource、たとえばを使用してレイアウトでそれらを使用します。

<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>

1
コードを記述しなくても画面の回転時に動的に寸法値を変更できるため、これが最良の答えです。
Phileo99

ドローアブルには@Vyacheslav、標準サイズ
waqaslam '13 / 12/16

まったく機能しません。AndroidStudioは失敗しても失敗する
Vyacheslav

使用する<dimen>
つもりだった

19

警告なしで正常に動作するように見える回避策も見つけました:

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

次に:

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

警告:xmlからではなく、Javaコードからdimenを使用する場合にのみ機能します


XML定義でandroid:lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER"のような値を使用すると、これは快適ではありません。レイアウトの拡張中にNumberFormatExceptionが発生します。
peter.bartos 2011

4
丁度。Javaコードからdimenを使用する場合にのみ機能します。
クリスティアン

2
これは、コードから浮動小数点にアクセスするために私が見つけた最良の方法です。
Alex Lockwood 2013

floats.xmlで<item name = "shadow_percent" type = "dimen"> 25%</ item>を追加し、ドローアブルでこのパーセントを使用して、android:centerY = "@ dimen / shadow_percentを使用してシャドウグラデーションの中心を設定しました」これは完全に機能し、レイヤーリストの全高の25%に影を設定しました。ありがとうございました!
Chris Sprague

注:type="fraction"Javaコードのエラーを回避するために使用する必要があります
adek111

8

フロートをdimens.xmlに追加します。

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

XMLから参照するには:

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

この値をプログラムで読み取るにはResourcesCompat.getFloat、androidx.coreから使用できます

Gradleの依存関係:

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

使用法:

import androidx.core.content.res.ResourcesCompat;

...

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

7

制約レイアウトのガイドラインとしても使用できます。

integer.xmlファイルを作成して追加

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

layout.xmlファイルから使用する

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
2つのレイアウトファイルを作成せずに、タブレット用とモバイル用の異なるパーセント値にこれを使用します
abdu

5

この問題を解決するためにスタイルを使用しました。公式リンクはこちら

かなり便利なもの。スタイル(「styles.xml」など)を保持するファイルを作成し、その中に定義します。次に、レイアウト内のスタイルを参照します(「main.xml」など)。

これはあなたが望むことをするサンプルスタイルです:

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

これで単純なTextViewを変更したいとしましょう。レイアウトファイルに次のように入力します。

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

試してみてください-これは本質的にすべての組み込みUIがAndroidで行われる方法です。また、スタイルを使用することで、ビューの他のあらゆる側面を変更することもできます。


2

範囲を制御する単純な浮動小数点数がある場合は、リソースに整数を入れて、コードで直接必要な小数点以下の桁数で除算することもできます。

だからこのようなもの

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

小数点以下2桁で使用されます

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

そしてそれはそれを作ります 3.56fにします

これが最もエレガントなソリューションであるとは言いませんが、単純なプロジェクトの場合は便利です。


0

機能する解決策を見つけましたが、LogCatにWarningWARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a})が表示されます。

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

<android:lineSpacingMultiplier="@string/text_line_spacing"/>

上記の私の答えを参照してください。フォーマットとタイプを指定する必要がある「汎用」リソース項目を使用できます。formatはJavaタイプ(float、boolean、fraction、integerなど)用で、typeはandroid genリソース参照用です(R.dimenは「dimen」、R.colorは「color」、R.stringは「string」)など)
Tomo

これは私の最初の答えでしたが、今は時代遅れです。そのため、私はあなたの答えを受け入れました。:)
slup

0

私は過去に受け入れられた答えを使用しましたが、現在のビルドツールで実行できるようです:

   <dimen name="listAvatarWidthPercent">0.19</dimen>

Build Toolsメジャーバージョン29を使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.