2013-03-27 5 views
4

dimens.xml 파일에 부동을 추가하려고합니다.

나는 following SO answer을 읽었습니다. 솔루션을 시도했을 때 주석에 설명 된 예외가 있습니다. 나는 이유를 알아 내려는 중입니다. 예외가 발생했습니다. getDimension 방법 정의 여기

final float zoom = this.getResources().getDimension(R.dimen.zoom_level); 

내가 안드로이드 소스에 뛰어되고 : 여기

<item name="zoom_level" format="float" type="dimen">15.0</item> 

이 불면 코드입니다 : 여기에 완성도를 들어

은 XML입니다

public float getDimension(int id) throws NotFoundException { 
    synchronized (mTmpValue) { 
     TypedValue value = mTmpValue; 
     getValue(id, value, true); 
     if (value.type == TypedValue.TYPE_DIMENSION) { 
      return TypedValue.complexToDimension(value.data, mMetrics); 
     } 
     throw new NotFoundException(
       "Resource ID #0x" + Integer.toHexString(id) + " type #0x" 
       + Integer.toHexString(value.type) + " is not valid"); 
    } 
} 

아무 이유없이 value.type != TypedValue.TYPE_DIMENSION입니다. Android 소스를 완전히 설정하지 않아서 Log.w("YARIAN", "value type is " + value.type)' 문을 쉽게 추가 할 수 없습니다.

나는 다음 getValue에 뛰어 호출의 체인 것 같다 :

Resources.getValue -> AssetManager.getResourceValue -> AssetManager.loadResourceValue 

loadResourceValue가 기본 방법이며 여기 내 굴착이 무너 곳입니다.

아무도 무슨 일이 일어나는지 이해하는 가장 좋은 방법은 알고 있습니까?


는 또한 ResourcesTypedValue.TYPE_FLOATTypedValue.TYPE_DIMENSION A가 들어 것으로 나타났습니다. 그러나 XML에서는 type="float"을 쓸 수 없습니다.

설명에 설명 된 해결 방법은 type=string을 사용하고 Float.parse을 사용하여 float을 얻는 것입니다. 필요한가? 그 이유는 무엇?

답변

13

나는 늦은 대답이지만, 제안한 것처럼 String을 float로 구문 분석하는 대신 TypedValue#getFloat()을 사용해야합니다.

XML :

<item name="float_resource" format="float" type="raw">5.0</item> 

자바 :

TypedValue out = new TypedValue(); 
context.getResources().getValue(R.raw.float_resource, out, true); 
float floatResource = out.getFloat(); 

당신이 만 R에서 자원 클래스에 해당 원하는 경우 typefraction, raw 또는 string, 넣을 수 있습니다.

+1

이것은 대답이되어야합니다. – Peter

+0

그러면이 XML은 어디에 있습니까? res/raw의 dimen xml? –

+0

@G_V 네, 그렇게 생각합니다. 어쨌든 모든 것이'R'에 의해 선택되어서 정말 중요하다고 생각하지 않습니다. – Rich

관련 문제