2013-02-12 4 views
7

안녕 나는 두 번째 줄에 NullPointerException을 제공으로안드로이드의 기본 리소스에서 비트 맵을 얻는 방법?

Bitmap bm = BitmapFactory.decodeResource(getResources(), android.R.drawable.list_selector_background); 

int c = bm.getPixel(bm.getWidth()/2, bm.getHeight()/2); 

하지만 BM은 null이다이 방법을 사용하여이 일을하고있다.

오류 : 액세스하려는 리소스가 자신의 자원이 아니라 시스템에 있기 때문에

02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.os.Looper.loop(Looper.java:137) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at dalvik.system.NativeStart.main(Native Method) 
02-12 18:29:57.568: E/AndroidRuntime(5086): Caused by: java.lang.NullPointerException 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at com.example.showhide.MainActivity.onCreate(MainActivity.java:38) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.Activity.performCreate(Activity.java:4465) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
02-12 18:29:57.568: E/AndroidRuntime(5086):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 

답변

5

이 리소스는 Bitmap이 아니기 때문에이 리소스가 StateListDrawable이기 때문입니다. 당신은 사용해야

Drawable d = getResources().getDrawable(android.R.drawable.list_selector_background); 

당신이 비트 맵 있다고 확신하는 경우

는 BitmapDrawable에 드로어 블을 캐스팅하고 거기에서 비트 맵을 얻을 :

Drawable currentState = d.getCurrent(); 
if(currentState instanceof BitmapDrawable) 
    Bitmap b = ((BitmapDrawable)currentState).getBitmap(); 

비트 맵이 null도 할 수있다. BitmapFactory 사용하지 않고

+0

StateListDrawable에있는 모든 드로어 블을 어떻게 얻을 수 있습니까? getState()를 사용할 때마다 항상 int []가 0 크기가됩니다. –

+1

특정 상태에 대한 드로어 블을 얻으려면이 StateListDrawable에 대해 getStateDrawableIndex 및 getStateDrawable을 사용하십시오. getState는이 StateListDrawable에 현재 적용된 상태 목록을 반환합니다. 참고 : [link] (http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html) – Zielony

+0

그리고 어떻게 ** Bitmap **을 얻을 수 있습니까? –

3

대신 getResources

Bitmap bm = BitmapFactory.decodeResource(Resources.getSystem(), android.R.drawable.list_selector_background); 

Resources.getSystem()를 사용해야합니다.

편집 : 잘못된 자원에 대한 다음

, 당신이 선택 (XML 파일) 인 자원에서 드로어 블을 얻기 위해 노력하고 있습니다. 올바른 드로어 블 리소스를 얻으십시오 :) http://androidxref.com/4.1.1/xref/frameworks/base/core/res/res/drawable/list_selector_background.xml

+0

여전히 같은 오류 –

+0

업데이트 답 .. –

+0

@lon 내가 StateListDrawable에있는 모든 것을 그릴 수를 얻을 수있는 방법, 그것은 나에게 좋은 도움을했지만, 당신이 말해 줄 수 Aalbers. getState()를 사용할 때마다 항상 int []가 0 크기가됩니다. –

4

:

Bitmap bmp = ((BitmapDrawable) context.getResources() 
      .getDrawable(R.drawable.list_selector_background)).getBitmap(); 
관련 문제