안드로이드 리소스 / 값에 부동 소수점 값 추가


243

문서android:lineSpacingMultiplier 에서 사용하여 TextViews에 줄 사이에 약간의 공백을 추가하려고합니다 .

승수로 텍스트 줄 사이의 추가 간격.

"1.2"와 같은 부동 소수점 값이어야합니다.

몇 가지 다른 TextViews에서이를 사용함에 따라 리소스에 전역 차원 / 값을 추가하고 싶지만 사용할 태그를 알지 못합니다. 나에게 맞는 모든 리소스 유형 을 시도했지만 그중 아무것도 작동하지 않습니다.

내가 갖고 싶은 것은 다음과 같습니다.

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

이런 식으로 float 숫자는 @dimen 아래에있게됩니다. 형식이 다음을 나타내는 다른 "format"및 / 또는 "type"수정자를 사용할 수 있습니다.

형식 = 둘러싸는 데이터 유형 :

  • 흙손
  • 부울
  • 분수
  • 정수
  • ...

유형은 다음을 나타냅니다.

유형 = 리소스 유형 (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);

이 경우, 값 lineSpacingIS는 2.024993896484375, 그리고 2.025당신이 예상하는 것처럼.


2
이것을 사용하려고 시도했지만 코드에서 값을 검색 할 때 NotFoundException, "유형 # 0x04가 유효하지 않습니다"가 표시됩니다.
— Moises Jimenez

문제에 대해 더 구체적으로 설명 할 수 있습니까? 형식에 잘못된 데이터 형식을 사용했을 것입니다.
— Tomo

19
@rodkarom xml에서 float를 검색하려면이 XML을 사용 <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

4
나는 hackish 부분을 제거해야한다고 생각합니다. 솔루션은 그대로 완벽합니다.
— Mathijs Segers


43

모든 솔루션은 코드를 통해 사전 정의 된 float 값을 사용하도록 제안합니다.

그러나 XML에서 미리 정의 된 float 값을 참조하는 방법을 궁금해하는 경우 (예 : 레이아웃) 다음은 내가 한 일의 예이며 완벽하게 작동합니다.

자원 값을 type="integer"but 로 정의하십시오 ( 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

전혀 작동하지 않습니다. AndroidStudio는 확장 기능으로도 실패
— Vyacheslav

<dimen>
— waqaslam을

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을 사용할 때만 작동합니다.


android : lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER"와 같은 XML 정의에서 이러한 값을 사용하면 불행히도 작동하지 않습니다. 레이아웃을 팽창시키는 동안 NumberFormatException이 발생합니다.
— peter.bartos

4
바로 그거죠. Java 코드의 dimen을 사용할 때만 작동합니다.
— 크리스티안

2
이것이 코드에서 플로트에 액세스하는 가장 좋은 방법입니다.
— Alex Lockwood

floats.xml에서 <item name = "shadow_percent"type = "dimen"> 25 % </ item>을 추가 한 다음 드로어 블에서이 백분율을 사용하여 android : centerY = "@ dimen / shadow_percent를 사용하여 그림자 그라디언트 중심을 설정했습니다. ". 이것은 그림자를 레이어 목록의 전체 높이의 25 %로 완벽하게 설정했습니다. 감사합니다!
— Chris Sprague 2016 년

참고 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.getFloatandroidx.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
정확히 필요한 것은 두 개의 레이아웃 파일을 만들지 않고 태블릿의 경우 다른 백분율 값과 모바일의 경우 다른 값으로 사용합니다
— 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에서 Warning( WARN/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"/>

위의 답변을 참조하십시오. 형식과 유형을 지정해야하는 "일반"자원 항목을 사용할 수 있습니다. 형식은 Java 유형 (float, boolean, fraction, integer 등)이며 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.