2014-11-12 2 views
0

짧은 질문 : typVal.resourceId0입니다Resources.Theme.resolveAttibute(attrId, typVal, true) 반환, 그 예외가 발생합니다. 이 ResourceReader.getResourceId()은 전체 앱의 모든 장소에서 잘 작동합니다. 내가 할 때이 오류 불행하게도 내가 결정할 수없는 응용 프로그램 를 다시 시작ResourcesNotFoundException 받고 있어요 : 그러나 무작위로, 응용 프로그램 업데이트 또는 여러 다시 시작한 후이 예외는 TypedValue.resourceId은 0

긴 질문 때문에 발생 발생합니다. 마지막으로 앱을 다시 시작 (닫기, 종료, 다시 시작, 업데이트, 설정) 할 때 여러 번 앱이 첫 번째 리소스 읽기 행에이 RNFE를 제공합니다.

스택 추적 :

Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0 
     at android.content.res.Resources.getValue(Resources.java:2331) 
     at android.content.res.Resources.getColor(Resources.java:2013) 
     at com.my.app.navi.NavigationFragment.setUp(NavigationDrawerFragment.java:570) 
     at com.my.app.main.MainActivity.onCreate(MainActivity.java:1071) 

은 그 예외를 생성하기 어렵다하지만 구글에서 내가 다른 장치에 의해 생성 된 예외를 많이 볼 수있는 개발자 콘솔을 재생합니다.

나는 그 예외에 대한 답을 많이 찾았지만 다시 작성하지 않았다. String.ValueOf(int), 자원 추가로 내 문제가 해결되었다.

스타일이 다른 여러 앱에 몇 가지 빌드 풍미가 있습니다. 그 때문에 자원에 대한 attr 스타일 참조를 사용합니다. 모든 맛은 다른 res 폴더가 있습니다. main res 폴더에는 참조 색상, 드로어 블 및 이미지를위한 attrs.xml이 있습니다. 다른 모든 코드와 XML 레이아웃 파일은 R.attrs이

의 경우는이

<declare-styleable name="Colors"> 
    <!--<<<<<<<<<<<<<<<<<<<<<COLORS>>>>>>>>>>>>>>>>>>>>>>>>>>>>--> 
    <attr name="c_pressed_button_back" format="color"/> 
    <attr name="c_window_back" format="color"/> 
    <attr name="c_navigation_drawer_back" format="color"/> 

flavor_one의 style.xml

<!--<<<<<<<<<<<<<<<<<<<<<<<<<COLORS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--> 
    <item name="c_pressed_button_back">@color/c_theme_pressed_button_back</item> 
    <item name="c_window_back">@color/c_theme_window_back</item> 
    <item name="c_navigation_drawer_back">@color/c_theme_navigation_drawer_back</item> 

flavor_one 색상 attrs.xml이 주요 고해상도이다 명확하게 내 상황을 설명 참조있다. xxx

<color name="c_theme_pressed_button_back">@color/c_theme_red</color> 
<color name="c_theme_window_back">@color/c_theme_green</color> 
<color name="c_theme_navigation_drawer_back">@color/c_theme_blue</color> 

이 설정을 통해이 클래스를 리소스 읽기 용으로 썼습니다. .

public class ResourceReader 
{ 
    public static int getResourceId(Resources.Theme thm, int attrId) 
    { 
     int returnValue = 0; 
     TypedValue typedValue = new TypedValue(); 
     try { 
      thm.resolveAttribute(attrId, typedValue, true); 
      returnValue = typedValue.resourceId; 
     } 
     catch (Exception ex) // Resource cannot resolved 
     { 
      ex.printStackTrace(); 
     } 
     if(returnValue == 0) 
     { 
      Log.e("yucel", "Resource resolved result is 0 @thm:" + thm + " attrid:" + attrId + " typdata:" + typedValue.data + " typtyp:" + typedValue.type + " "); 
     } 
    return returnValue; 
    } 
} 

그리고 마침내 내가 던져 질 것이다 getColor(back_color_id) 예외의 줄에

int back_color_id = ResourceReader.getResourceId(appData.appContext.getTheme(), R.attr.c_navigation_drawer_back); 
    int back_color= appData.appRes.getColor(back_color_id); 
    mDrawerLayout.setColor(back_color); 

같은 자원을 사용합니다. 왜냐하면 back_color_id는 0과 같습니다. 리소스 리더에서 thm.resolveAttribute(attrId, typedValue, true);

나는 전체 코드 구문이 좋다고 본다. 전체 앱과이 구조를 사용하는 99 %가 잘 작동하기 때문입니다. 문제는 여러 번 다시 시작한 후 자원 읽기에 무작위로 발생합니다. 그 자리에서 뭔가가 바뀌어야합니다. Context.isResourceLoading() 또는 Resoureces.isLoaded()과 같은 올바른 상태의 리소스가 있는지 확인하는 방법이 있습니까?

몇 가지 재시작 후 또는 업데이트 후 무작위로 한 가지 문제를 겪고있는 리소스가 있습니까?

답변

0

attr이 변경되었습니다.테마 항목을 읽는 xml 읽기

잘 작동합니다. 그러나 그것에 관한 문제가 있습니다. 동적 테마 변경 및 다른 flavor 변수 참조를 위해 attr.xml 참조를 만듭니다. flavor_one 종로에서

는 flavor_two 디자인에라는 이름의 색상 = c_open_dialog_backcolor 으로 열려있는 대화 배경을 가지고이가 그릴 수 d_open_dialog_back_pattern라는 이름의 XML로 참조 =

그러나이 두 가지 디자인에 차이점에서와 같은 자바 코드가 usern resource resolver with R.attr.dialog_bakground

Resources.Theme.resolveAttribute(int resid, TypedValue outValue, boolean resolveRefs)에 의해 생성 된 문제가 응용 프로그램을 다시 시작하거나 업데이트 할 때 리소스를 읽을 수 없다고 보입니다.

코드를 변경하고 모든 attr.xml 항목을 삭제하면 해당 기능이 현재 제대로 작동합니다. 감사.

관련 문제