安卓“通用”Webview

6
我正在为 Android 开发混合应用程序,但是 Android 的 WebView 渲染取决于操作系统版本,因此,Android 2.3 WebView 与 Android 4.0 WebView 渲染和行为不同,而 Android 4.4 WebView 则又不同于前两者。所有这些碎片化使得开发基于 HTML 的应用程序成为一个真正的问题。我不是在谈论不同的屏幕尺寸或密度,而是在谈论特定的 WebView 错误或渲染引擎。

是否存在一种“通用”的 WebView 组件(开源或商业),我可以将其嵌入我的应用程序中,以便我不必编写特定的 WebView CSS Hack,只需在任何 Android > 2.3 版本上获得相同的渲染和行为?

我知道有一些实验性项目,例如 https://github.com/davisford/android-chromium,但找不到任何准备好供生产使用的项目。


你找到任何解决方案了吗? - Oleg Pasko
1
未找到解决方案...chromeview 似乎是最佳选择,但仅当 2.3 版本的设备在 Android 宇宙中成为不重要的一部分时。 - Giorgio Andretti
@GiorgioAndretti,你找到解决方案了吗? - yozhik
不,说实话没有这样的组件。现在,这个问题已经过时了,所以在现代Android版本中,“特定”的行为更少见,但如果你真的需要支持旧版本,那么就没有解决方案。 - Giorgio Andretti
3个回答

4

我想这正是您所寻找的。

ChromeView“这使您的应用程序提前访问Chromium的最新功能,并消除了在不同版本的Android中不同WebView实现所导致的可变性。”

https://github.com/pwnall/chromeview


这可能适用于4.0及以上版本(API 14+),但对于2.3(OP所需的版本)不起作用,因为Chromium使用了许多在2.3中不存在的API。 - matiash
Intel XDK Crosswalk支持所有Android 4.x设备上的通用Webview。不幸的是,2.3设备上没有任何支持。 - G3M

2

这方面的工具并不多,我怀疑它们是否能像系统内置的WebView一样好。

  1. Chromeview最低API 14,基于Chromium,看起来相当不错且很少有bug。
  2. Geckoview最低API 8,来自Mozilla,可能会存在一些bug...
  3. Android-Chromium:已从github中删除...

0

您可以使用WebChrmeClient来实现此功能,无需进行任何黑客操作,下面的代码将适用于HTML、URL和CSS,只需看一下:

public class IjoomerWebviewClient extends Activity {

    private WebView webExternalLinks;
    private IjoomerButton btnClose;
    private String link = "";
    private String IN_CONTENT = "";
    SeekBar seekBar;



@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.YOUR_WEBVIEW_LAYOUT);

 webExternalLinks = (WebView) findViewById(R.id.webExternalLinks);
        btnClose = (IjoomerButton) findViewById(R.id.btnClose);

getData();
}

  private void getData(){

  getIntentData();

        webExternalLinks.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                if(seekBar==null){
                    seekBar = IjoomerUtilities
                            .getLoadingDialog(getString(R.string.dialog_loading_please_wait));
                }
                seekBar.setProgress(progress);
                if(progress==100){
                    seekBar=null;
                }
            }
        });

        webExternalLinks.setWebViewClient(new WebViewClient());
        webExternalLinks.getSettings().setJavaScriptEnabled(true);
        webExternalLinks.getSettings().setPluginState(PluginState.ON);
        webExternalLinks.getSettings().setSupportZoom(true);
        webExternalLinks.getSettings().setBuiltInZoomControls(true);

        if (link != null && link.length() > 0) {
            if (!link.startsWith("http://") && !link.startsWith("https://")) {
                link = "http://" + link;
            }
            webExternalLinks.loadUrl(link);
        } else if (IN_CONTENT != null && IN_CONTENT.trim().length() > 0) {
            StringBuilder sb = new StringBuilder(); // StringBuilder();
            sb.append("<HTML><HEAD><link rel=\"stylesheet\" type=\"text/css\" href=\"weblayout.css\" /></HEAD><body>");
            String str = IN_CONTENT.trim();
            str = str.replaceAll("<iframe width=\"[0-9]*",
                    "<iframe width=\"100\\%");
            str = str.replaceAll("<img[\\w]*",
                    "<img height=\"auto\" style=\"max-width:100\\%\";");
            sb.append(str);
            sb.append("</body></HTML>");
            webExternalLinks.loadDataWithBaseURL("file:///android_asset/css/",
                    sb.toString(), "text/html", "utf-8", null);
        }
}



    private void getIntentData() {
        try {
            link = this.getIntent().getStringExtra("url");
            if (link == null) {
                IN_CONTENT = this.getIntent().getStringExtra("IN_CONTENT");
            }

        } catch (Exception e) {
            IN_CONTENT = this.getIntent().getStringExtra("IN_CONTENT");
        }
    }

    @Override
    public void onBackPressed() {
        if(webExternalLinks.canGoBack()){
            webExternalLinks.goBack();
        }else{
            super.onBackPressed();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接