【问题标题】:Set a NinePatch Background Programmatically以编程方式设置 NinePatch 背景
【发布时间】:2014-02-08 10:35:36
【问题描述】:

当我尝试以编程方式使用 9patch 背景时,

仅在以下情况下有效:(场景 1)“拉伸区域”(顶部/左侧)大于“内容填充区域”(底部/右侧)

但如果:(场景 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);

【问题讨论】:

  • 尝试 setBackgroundDrawable 代替 bof setBackground

标签: android nine-patch


【解决方案1】:

无需创建NinePatchDrawable 对象。您可以简单地使用setBackgroundResource(R.drawable.ninepatch_background)。我不知道这是否是问题,但我希望它有所帮助。

【讨论】:

  • 您的文件必须以“.9.png”结尾
  • 这应该被标记为正确答案。无需为此使用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));

【讨论】:

  • 当我尝试使用此代码时 - 我得到:Caused by: java.lang.NullPointerException
【解决方案3】:

我最终做的是使用场景 1 NinePatch(Stretch 大于 Padding - 我不想要)

并使用以下代码手动设置填充区域:

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);
}

【讨论】:

    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2011-03-18
    • 2016-06-12
    相关资源
    最近更新 更多