如果布局中有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,完美
重写 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,再检查下其他代码
继承 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());
}
还是不行呢?请问你们是怎么处理的呢