짧은 질문 : typVal.resourceId
이 0입니다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()
과 같은 올바른 상태의 리소스가 있는지 확인하는 방법이 있습니까?
몇 가지 재시작 후 또는 업데이트 후 무작위로 한 가지 문제를 겪고있는 리소스가 있습니까?