2013-02-12 7 views
7

Hallo Ich tue dies auf diese Weise mitWie bekomme ich Bitmap von der Standardressource von Android?

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

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

aber bm null ist als NullPointerException in zweiter Linie gibt.

Fehler:

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) 

Antwort

5

Es ist, weil diese Ressource ein StateListDrawable, kein Bitmap. Sie sollten verwenden:

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

Wenn Sie sicher sind, dass es sich um eine Bitmap ist, werfe den ziehbar zu BitmapDrawable und erhalten Bitmap von dort:

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

Die Bitmap kann null als gut.

+0

Kannst du mir sagen, wie ich all diese Zeichen in StateListDrawable erhalten kann. Mit getState() bekomme ich immer int [] mit 0 size. –

+1

Um einen Zeichensatz für einen bestimmten Zustand zu erhalten, verwenden Sie getStateDrawableIndex und getStateDrawable für diese StateListDrawable. getState gibt die Liste der Zustände zurück, die momentan für diese StateListDrawable gelten. Siehe: [link] (http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html) – Zielony

+0

Und wie bekommst du dann ** Bitmap **? –

3

Sie sollten Resources.getSystem() anstelle von getResources

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

Da die Ressource, die Sie zugreifen möchten, ist nicht in der eigenen Ressourcen, sondern im System der.

Edit:

Neben den falschen Ressourcen, Sie versuchen, eine ziehbar von einer Ressource zu erhalten, die ein Selektor (xml-Datei) ist. Bitte setzen Sie sich das Recht vor ziehbar Ressource :) http://androidxref.com/4.1.1/xref/frameworks/base/core/res/res/drawable/list_selector_background.xml

+0

noch denselben Fehler –

+0

aktualisiert Antwort .. –

+0

@lon AALBERS es für mich gute Hilfe war aber können Sie mir sagen, Wie kann ich all das ziehbar erhalten, die in StateListDrawable sind. Mit getState() bekomme ich immer int [] mit 0 size. –

4

Ohne Verwendung BitmapFactory:

Bitmap bmp = ((BitmapDrawable) context.getResources() 
      .getDrawable(R.drawable.list_selector_background)).getBitmap(); 
Verwandte Themen