2014-02-08 2 views
2

Когда я пытаюсь использовать 9patch фон программнымУстановить фон NinePatch Программным

это работает только тогда, когда: (сценарий 1) в «Натяжные Регионы» (верх/слева) больше затем «Padding регионов контента '(снизу/справа)

но если: (сценарий 2) заполнение больше, то на участке - я получаю эту ошибку:

02-08 10:32:04.203: E/AndroidRuntime(397): FATAL EXCEPTION: main 
02-08 10:32:04.203: E/AndroidRuntime(397): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.game.test}: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.os.Looper.loop(Looper.java:123) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-08 10:32:04.203: E/AndroidRuntime(397): at java.lang.reflect.Method.invokeNative(Native Method) 
02-08 10:32:04.203: E/AndroidRuntime(397): at java.lang.reflect.Method.invoke(Method.java:507) 
02-08 10:32:04.203: E/AndroidRuntime(397): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-08 10:32:04.203: E/AndroidRuntime(397): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-08 10:32:04.203: E/AndroidRuntime(397): at dalvik.system.NativeStart.main(Native Method) 
02-08 10:32:04.203: E/AndroidRuntime(397): Caused by: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-08 10:32:04.203: E/AndroidRuntime(397): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

кто знает, как решить сценарий 2?

Код:

linLayout = new LinearLayout(this); 
NinePatchDrawable ninep = (NinePatchDrawable)getResources().getDrawable(R.drawable.ninepatch_background) ; 
linLayout.setBackground(ninep); 
+0

Попробуйте setBackgroundDrawable вместо botgroundBackground – Aashir

ответ

1

То, что я в конечном итоге делает это использовать сценарий 1 NinePatch (Stretch больше, то Перетяжка - что я не хотел)

и настроить зону заполнения вручную, с этим кодом:

NinePatchDrawable ninepatch; 
Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.ninepatch_background); 
if (image.getNinePatchChunk()!=null){ 
    byte[] chunk = image.getNinePatchChunk(); 
    Rect paddingRectangle = new Rect(30, 0, 30, 50); 
    ninepatch = new NinePatchDrawable(getResources(), image, chunk, paddingRectangle, null); 
} 
int sdk = android.os.Build.VERSION.SDK_INT; 
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
    linLayout.setBackgroundDrawable(ninepatch); 
} else { 
    linLayout.setBackground(ninepatch); 
} 
+0

Спасибо @Erez, это сработало для меня! –

2

Там нет необходимости создавать NinePatchDrawable объект. Вы можете просто использовать setBackgroundResource(R.drawable.ninepatch_background). Я не знаю, если это проблема, но я надеюсь, что это поможет.

+0

он только исказил изображение (как будто это не было 9patch) ... – Erez

+0

ваш файл должен заканчиваться на «.9.png» –

+0

Это должно быть отмечено как правильный ответ. Для этого не нужно использовать 'NinePatchDrawable'. Конец истории. –

2

Попробуйте этот. Работал для меня.

private Drawable displayNinePatch(String path, Context context) { 
    Bitmap bitmap = BitmapFactory.decodeFile(path); 
    byte[] chunk = bitmap.getNinePatchChunk(); 
    if(NinePatch.isNinePatchChunk(chunk)) { 
     return new NinePatchDrawable(context.getResources(), bitmap, chunk, new Rect(), null); 
    } else return new BitmapDrawable(bitmap); 
} 

набор изображений для ImageView

yourimageview.setBackgroundDrawable(displayNinePatch("/data/data/your.app/files/urnineimage.9.png", yourcontext)); 
+0

Когда я пытаюсь использовать этот код - я получаю: вызвано: java.lang.NullPointerException – Erez

+0

@Erez at where ???? – Piyush

Смежные вопросы