在自定义视图中获取“onDraw”的 xml 上下文

Get context in xml for "onDraw" in a custom view

提问人:Sambhav Khandelwal 提问时间:4/6/2022 最后编辑:Sambhav Khandelwal 更新时间:4/16/2022 访问量:149

问:

我想从视图预览方法中的 url 加载图像。我试着用毕加索来做到这一点。但是,我在 xml 中出现错误。这就是方法。onDrawonDraw

@Override
    protected void onDraw(Canvas canvas) {
        this.canvas = canvas;
        Picasso.get()
                .load(currentUrl)
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                        Drawable d = new BitmapDrawable(getResources(), bitmap);
                        d.draw(canvas);
                    }

                    @Override
                    public void onBitmapFailed(Exception e, Drawable errorDrawable) {
                        Paint paint = new Paint();
                        paint.setColor(Color.BLACK);
                        canvas.drawText("Error to load",getWidth() / 2, getHeight() / 2,paint);
                    }

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {

                    }
                });
    }

但是,毕加索抱怨没有上下文来加载文件。这是错误:enter image description here

和文字:

java.lang.IllegalStateException: context == null
    at com.squareup.picasso.Picasso.get(Picasso.java:681)
    at com.sambhav2358.badgegeneratorlibrary.BadgeView.setLogo(BadgeView.java:189)
    at com.sambhav2358.badgegeneratorlibrary.BadgeView.init(BadgeView.java:69)
    at com.sambhav2358.badgegeneratorlibrary.BadgeView.<init>(BadgeView.java:91)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:352)
    at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:189)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:149)
    at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:301)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:417)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:428)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:332)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:1127)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:1101)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:686)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:505)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:361)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:436)
    at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:121)
    at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:736)
    at com.android.tools.idea.rendering.RenderTask.lambda$inflate$7(RenderTask.java:892)
    at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)

我的整个班级链接都在这里

java android-自定义视图 Picasso Ondraw

评论

0赞 Primož Ivančič 4/6/2022
这回答了你的问题吗?如何使用 isInEditMode() 在编辑器中查看带有自定义视图的布局
0赞 Sambhav Khandelwal 4/6/2022
呃嗯。不。但是,即使在使用编辑模式时,我如何获取上下文
0赞 ADM 4/6/2022
不要在 ..在您的自定义视图中有一个,并在 UI 组件中加载图像,例如,然后将位图设置为视图并使视图无效。这也将帮助您处理错误情况,例如图像加载失败,其他一些事情。onDrawBitmapActivity
0赞 Sambhav Khandelwal 4/6/2022
你能分享代码吗?我没有完全得到你
1赞 Ryan M 4/16/2022
请注意堆栈跟踪:您的方法有问题 - 我们需要看到它才能知道出了什么问题。BadgeView.setLogo

答:

0赞 Primož Ivančič 4/6/2022 #1

AFAIK,如果应用程序未运行,则无法获取引用。Context

0赞 Roberto Muñoz Rodríguez 4/6/2022 #2

您是否尝试过使用 Glide?它是另一个收费图像库。

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.android.support:support-v4:23.1.1'
}

尝试这样做

  private void initLocal() {
        // Charge img 
        Glide.with(this).load(URL).into(imgView);
    }

评论

2赞 ADM 4/6/2022
问题不在于图书馆。它是关于视图生命周期的。此外,您不应该只是推荐其他一些库作为答案。
0赞 Sambhav Khandelwal 4/6/2022
谢谢你的回答。但是,这不是我想要的