欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WEEX-EEUI 关于eeui TabBar 在release包下使用assets图片资源无法显示问题

程序员文章站 2022-06-01 22:22:17
...

前言

从官方公布的weex框架学习,转到eeui学习之后。感觉坑没有之前那么大,那么多了。

问题

今天遇到一个问题,使用eeui的TabBar之后,打包的release包看不到图片配置的selecticon和unselecticon图片,仔细想想WEEX-EEUI 关于eeui TabBar 在release包下使用assets图片资源无法显示问题没有这个问题,猜想应该是本地图片路径的问题。

找到TabBar组件 找到对应的selectIcon,查看selectIcon在从vue传到原生之后selectIcon的值先后进行了那些变化

WEEX-EEUI 关于eeui TabBar 在release包下使用assets图片资源无法显示问题
先秀出我的修改之前和修改之后的代码,左边是之前,右边是之后

找到核心关键类
app.eeui.framework.extend.view.tablayout.CommonTabLayout.java

找到关键类之后,定位到setImageView方法

在方法入口打上断点,这里有个技巧如何触发断点,可以修改一下vue文件ctrl+s来触发刷新,断点就会走到这里

观察断点,我们看到file://assets/打头的本地路径
我们可以对比一下ImageAdapter类打印的本地路径
找到app.eeui.framework.extend.adapter.ImageAdapter.java
定位到loadImage方法,打断点,使用上面介绍的技巧
我们发现:本地文件路径是file:///android_asset/打头的,我们顺着loadImage的代码逻辑
展示代码

  Log.i("ImageAdapter_loadImage",url);
        String tempUrl = eeuiBase.config.verifyFile(eeuiPage.rewriteUrl(view, handCachePageUrl(view.getContext(), url)));
if (tempUrl.startsWith("file://assets/")) {
                    tempUrl = "file:///android_asset/" + tempUrl.substring(14);
                }
                Log.d(TAG, "loadImage: " + tempUrl);
                Picasso.with(view.getContext()).load(tempUrl).into(view, new Callback() {
                    @Override
                    public void onSuccess() {
                        if (strategy.getImageListener() != null) {
                            strategy.getImageListener().onImageFinish(url, view, true, null);
                        }
                        recordImgLoadResult(strategy.instanceId, true, null);

                        if (!TextUtils.isEmpty(strategy.placeHolder)) {
                            ((Picasso) view.getTag(strategy.placeHolder.hashCode())).cancelRequest(view);
                        }
                    }

                    @Override
                    public void onError() {
                        if (strategy.getImageListener() != null) {
                            strategy.getImageListener().onImageFinish(url, view, false, null);
                        }
                        recordImgLoadResult(strategy.instanceId, false, null);
                    }
                });

找到这里我们就找到了问题的核心了,剩下的我就细说了,都很简单

拿来主义:

setImageView方法

 String finalIconUrl = iconUrl;
//            String loadUrl = loadAssetsUrl(eeuiBase.config.verifyFile(eeuiPage.rewriteUrl(icon, iconUrl)));
            Log.i("setImageView_loadImage",iconUrl);
            iconUrl=iconUrl.replace("../../","root://");

            String loadUrl = eeuiBase.config.verifyFile(eeuiPage.rewriteUrl(icon, handCachePageUrl(icon.getContext(), iconUrl)));

            if (loadUrl.startsWith("file://assets/")) {
                loadUrl = "file:///android_asset/" + loadUrl.substring(14);
            }
            Log.i("setImageView",loadUrl);
private String handCachePageUrl(Context context, String url) {
        if (TextUtils.isEmpty(url)) {
            return url;
        }
        File pageCache = context.getExternalFilesDir("page_cache");
        if (pageCache == null) {
            return url;
        }
        File updateFile = context.getExternalFilesDir("update");
        if (updateFile == null) {
            return url;
        }
        String cacheUrl = "file://" + pageCache.getPath() + updateFile.getPath() + "/";
        if (url.startsWith(cacheUrl)) {
            String tmpUrl = url.substring(cacheUrl.length());
            if (tmpUrl.contains("/") && NumberUtils.isCreatable(tmpUrl.substring(0, tmpUrl.indexOf("/")))) {
                url = "root:/" + tmpUrl.substring(tmpUrl.indexOf("/"));
            }
        }
        return url;
    }

后续会持续更新我在学习和使用eeui过程种所碰到的坑分享给大家,喜欢的关注一下我哦