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


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.