panpf / sketch

Sketch is an image loading library designed for Compose Multiplatform and Android View. It is powerful and rich in functions. In addition to basic functions, it also supports GIF, SVG, video thumbnails, Exif Orientation, etc.
Apache License 2.0
2.01k stars 307 forks source link

No field mMaxWidth in class Landroid/widget/ImageView #145

Closed tall-nuts closed 2 years ago

tall-nuts commented 3 years ago
2020-12-24 19:36:31.774 2010-2010/com.coder1024.mall W/System.err: java.lang.NoSuchFieldException: No field mMaxWidth in class Landroid/widget/ImageView; (declaration of 'android.widget.ImageView' appears in /system/framework/framework.jar!classes3.dex)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at java.lang.Class.getDeclaredField(Native Method)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at k.a.a.i.k.l(ImageSizeCalculator.java:95)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at k.a.a.i.k.m(ImageSizeCalculator.java:61)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at k.a.a.i.k.b(ImageSizeCalculator.java:132)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at k.a.a.o.c.b(DisplayHelper.java:611)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at k.a.a.o.c.e(DisplayHelper.java:495)
2020-12-24 19:36:31.775 2010-2010/com.coder1024.mall W/System.err:     at me.panpf.sketch.SketchImageView.j(SketchImageView.java:52)

image

Android Q Non-SDK interface restrictions.

------------------------------------------------- 解决方法---------------------------------------------- ImageView提供了getMaxHeight()/getMaxWidth(),不用反射直接提供同名方法处理。

public interface SketchView {
    ......

    int getMaxWidth();

    int getMaxHeight();
}
public abstract class FunctionCallbackView extends ImageView implements SketchView {
    @Override
    public int getMaxWidth() {
        return super.getMaxWidth();
    }

    @Override
    public int getMaxHeight() {
        return super.getMaxHeight();
    }

    ......
}
public class ImageSizeCalculator {
private static int getWidth(@Nullable SketchView sketchView, boolean checkMaxWidth, boolean acceptWrapContent, boolean subtractPadding) {
        if (sketchView == null) {
            return 0;
        }

        int width = 0;
        final ViewGroup.LayoutParams params = sketchView.getLayoutParams();
        if (params != null) {
            width = params.width;
            if (subtractPadding && width > 0 && (width - sketchView.getPaddingLeft() - sketchView.getPaddingRight()) > 0) {
                width -= sketchView.getPaddingLeft() + sketchView.getPaddingRight();
                return width;
            }
        }
        if (width <= 0 && checkMaxWidth) {
            // width = getViewFieldValue(sketchView, "mMaxWidth");
            width = sketchView.getMaxWidth();
        }
        if (width <= 0 && acceptWrapContent && params != null && params.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
            width = -1;
        }
        return width;
    }

    private static int getHeight(@Nullable SketchView sketchView, boolean checkMaxHeight, boolean acceptWrapContent, boolean subtractPadding) {
        if (sketchView == null) {
            return 0;
        }

        int height = 0;
        final ViewGroup.LayoutParams params = sketchView.getLayoutParams();
        if (params != null) {
            height = params.height;
            if (subtractPadding && height > 0 && (height - sketchView.getPaddingTop() - sketchView.getPaddingBottom()) > 0) {
                height -= sketchView.getPaddingTop() + sketchView.getPaddingBottom();
                return height;
            }
        }
        if (height <= 0 && checkMaxHeight) {
            // height = getViewFieldValue(sketchView, "mMaxHeight");
            height = sketchView.getMaxHeight();
        }
        if (height <= 0 && acceptWrapContent && params != null && params.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
            height = -1;
        }
        return height;
    }

    ......
}
panpf commented 2 years ago

全新 3.0 版本已经发布 alpha 版,欢迎体验。此问题已修复