web-dev-qa-db-ja.com

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

documentationAndroid:lineSpacingMultiplierを使用して、TextViewに行間に小さなスペースを追加しようとしています。

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

「1.2」などの浮動小数点値である必要があります。

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

私が持ちたいのは次のようなものです:

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

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

219
slup

解決策があります:

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

このようにして、浮動小数点数は@dimenの下になります。 formatが表す他の「format」および/または「type」修飾子を使用できることに注意してください。

形式=囲むデータ型:

  • float
  • ブール値
  • 端数
  • 整数
  • ...

タイプは以下を表します:

タイプ=リソースタイプ(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.024993896484375であり、予想どおり2.025ではありません。

480
Tomo

このリンクで説明されているように http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html

Dimen.xmlで宣言する

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

XMLからの参照

@dimen/my_float_value

Javaからの参照

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

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

しかし、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>
37
waqaslam

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

<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を使用する場合にのみ機能します

18
Cristian

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

Integer.xmlファイルを作成して追加します

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

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

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

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

かなり便利なもの。スタイルを保持するファイル(「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."
/>

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

5
Scott Biggs

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

こんな感じ

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

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

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

そしてそれはそれを作る.56f

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

2

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

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

XMLから参照するには:

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

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

Gradle依存関係:

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

使用法:

import androidx.core.content.res.ResourcesCompat;

...

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

解決策を見つけましたが、動作しますが、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"/>
0
slup