JessYanCoding/AndroidAutoSize

如果布局中有webview,这种自动适配会失效

kexuebiao opened this issue · 20 comments

我最近遇到的问题,
以下的布局,没有webview时候,适配是ok的,但是如果有webview的化,这种是适配就失效了
不知楼主有没有好的方案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <WebView
        android:id="@+id/webView"
        android:layout_width="180dp"
        android:layout_height="180dp"
        android:background="#FF0000" />

    <View
        android:layout_width="180dp"
        android:layout_height="180dp"
        android:background="#00FF00" />
</LinearLayout>

继承 WebView 并重写 setOverScrollMode(int mode) 方法

@Override
public void setOverScrollMode(int mode) {
       super.setOverScrollMode(mode);
       AutoSize.autoConvertDensityOfGlobal(Activity)
}

ok,完美

这种方案的原理:
image

有种情况:当webView在第三方sdk容器中时,就无法自定义webView了,这种情况有没有完美的兼容方案?
我有种方案:是在打包时使用aaptOptions功能,动态替换掉有webView的layout文件,不过侵入性太强,

重写 Activity 的 onCreateView(View parent, String name, Context context, AttributeSet attrs) 方法,在调用 super 之前调用一遍 AutoSize.autoConvertDensityOfGlobal(Activity)

在BaseActivity中加上这一行代码确实可以解决问题,但是如果有一个页面AActivity在单独进程中,那么AActivity不能去继承BaseActivity,否则会出现错误。

#2 java.lang.IllegalArgumentException
you must set design_width_in_dp in your AndroidManifest file

这说明我要在新的进程中再次配置这个design_width_in_dp
否则认为这个新的进程没有适配
但是我想适配这个单独的进程
我该怎么配置?

@XiFanYin 这个进程中页面多吗

@JessYanCoding 您好,该进程中就 一个 Activity,是用来播放 U3d 内容相关的。上面是我朋友代我提交的 issue。

@13kmsteady 使用 v0.9.5 或以上版本,implementation 'me.jessyan:autosize:0.9.5',然后在 App 初始化时调用 AutoSize#initCompatMultiProcess(Context),像 这样

@JessYanCoding 多谢群主大大,您太用心了。注释都写的这么详细,感谢您的付出。

@13kmsteady 感谢认可

override fun onCreateView(parent: View?, name: String?, context: Context?, attrs: AttributeSet?): View {
    AutoSize.autoConvertDensityOfGlobal(this)
    return super.onCreateView(parent, name, context, attrs)
}

加了这个autoConvertDensityOfGlobal报异常...
java.lang.IllegalStateException: super.onCreateView(parent, name, context, attrs) must not be null

@wmjwmj828 如果报错只有这一句的话,那报错和框架没有任何关系,这行代码并不会导致 onCreateView 为 null,再检查下其他代码

xw-s commented

继承 WebView 并重写 setOverScrollMode(int mode) 方法

@Override
public void setOverScrollMode(int mode) {
       super.setOverScrollMode(mode);
       AutoSize.autoConvertDensityOfGlobal(Activity)
}

fragment中有webview怎么调整?重写setOverScrollMode时,那个activity为null。该怎么设置?求解?

继承 WebView 并重写 setOverScrollMode(int mode) 方法

@Override
public void setOverScrollMode(int mode) {
       super.setOverScrollMode(mode);
       AutoSize.autoConvertDensityOfGlobal(Activity)
}

fragment中有webview怎么调整?重写setOverScrollMode时,那个activity为null。该怎么设置?求解?

@Override
public void setOverScrollMode(int mode) {
    super.setOverScrollMode(mode);

        AutoSize.autoConvertDensityOfGlobal((Activity) getContext());

}

继承 WebView 并重写 setOverScrollMode(int mode) 方法

@Override
public void setOverScrollMode(int mode) {
       super.setOverScrollMode(mode);
       AutoSize.autoConvertDensityOfGlobal(Activity)
}

fragment中有webview怎么调整?重写setOverScrollMode时,那个activity为null。该怎么设置?求解?

public class MyWebView extends WebView{

public MyWebView(Context context) {
    super(context);


}
@Override
public void setOverScrollMode(int mode) {
    super.setOverScrollMode(mode);

        AutoSize.autoConvertDensityOfGlobal((Activity) getContext());
}

public MyWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

}

@JessYanCoding 当webView在第三方sdk容器中时,就无法自定义webView了,这种情况有没有完美的兼容方案?同 @netman44 的问题.

@cshenhb 这个问题是因为在 setOverScrollMode 方法执行之后, density 被重制了,所以在 setOverScrollMode 方法中重设下 density 就可以了,如果无法自定义 webView,无法重写 setOverScrollMode 方法,那就需要再重新找到一个合适的时机修改 denisty,保证 WebView 在显示之前,density 是一个正确的值,但我没具体研究过,所以也不清楚,需要自己去找。

如果你不想找,或者找不到这个时机,那就直接取消 webView 这个页面的适配,框架的 ExternalAdaptManager 可以支持三方库页面的取消适配,或者直接使用副单位,使用副单位可以屏蔽修改 density 对所有三方库和系统控件的影响,只让自己想适配的地方适配,范围可控。

原生页面嵌套一个webview,webview的内容显示放大了,重写webview的
@OverRide
public void setOverScrollMode(int mode) {
super.setOverScrollMode(mode);

    AutoSize.autoConvertDensityOfGlobal((Activity) getContext());

}
还是不行呢?请问你们是怎么处理的呢

@andyjxc 您好 请问webview显示内容放大您是怎么解决的