Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
kexuebiao opened this issue Aug 21, 2018 · 20 comments
Closed

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

kexuebiao opened this issue Aug 21, 2018 · 20 comments

Comments

@kexuebiao
Copy link

kexuebiao commented Aug 21, 2018

我最近遇到的问题,
以下的布局,没有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>
@JessYanCoding
Copy link
Owner

JessYanCoding commented Aug 21, 2018

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

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

@kexuebiao
Copy link
Author

ok,完美

@netman44
Copy link

netman44 commented Aug 25, 2018

这种方案的原理:
image

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

@JessYanCoding
Copy link
Owner

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

@XiFanYin
Copy link

XiFanYin commented Sep 5, 2018

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

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

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

@JessYanCoding
Copy link
Owner

@XiFanYin 这个进程中页面多吗

@13kmsteady
Copy link

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

@JessYanCoding
Copy link
Owner

JessYanCoding commented Sep 12, 2018

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

@13kmsteady
Copy link

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

@JessYanCoding
Copy link
Owner

@13kmsteady 感谢认可

@mackwu828
Copy link

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

@JessYanCoding
Copy link
Owner

JessYanCoding commented Oct 29, 2018

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

@xw-s
Copy link

xw-s commented Mar 26, 2019

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

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

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

@haohao123456
Copy link

继承 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());

}

@haohao123456
Copy link

继承 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);
}

}

@cshenhb
Copy link

cshenhb commented Nov 13, 2019

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

@JessYanCoding
Copy link
Owner

JessYanCoding commented Nov 14, 2019

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

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

@andyjxc
Copy link

andyjxc commented Dec 23, 2019

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

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

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

@JessYanCoding
Copy link
Owner

@andyjxc #13 (comment)

@skyshenfu
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests