2013-02-12 14 views
7

こんにちは私は2番目の行で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に現在適用されている状態のリストを返します。参照してください:[リンク](http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html) – Zielony

+0

そして、どのように** Bitmap **を取得しますか? –

3

あなたはResources.getSystem()代わりのgetResources

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

を使用する必要があります。

編集:間違ったリソースへ

次は、セレクタ(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(); 
関連する問題