5

我正在为 android 开发一个混合应用程序,但 android webview 渲染因操作系统版本而异。因此,android 2.3 webview 的呈现和行为与 android 4.0 webview 的呈现和行为不同,android 4.0 webview 的呈现和行为与 android 4.4 webview 不同......所有这些碎片都是一个真正的混乱,使得开发基于 html 的应用程序成为一个问题。我不是在谈论不同的屏幕尺寸或密度,而是在谈论特定的 webview 错误或渲染引擎。

是否存在我可以嵌入到我的应用程序中的“通用”webview 组件(开源或商业),这样我就不必编写特定的 webview css hack 来在任何 android > 2.3 版本上获得相同的渲染和行为?

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

4

3 回答 3

4

我想这就是你要找的东西。

ChromeView “这使您的应用程序可以尽早访问 Chromium 中的最新功能,并消除由于不同版本的 Android 中的不同 WebView 实现而导致的可变性。”

https://github.com/pwnall/chromeview

于 2014-06-08T11:21:59.040 回答
1

那里的工具并不多,我怀疑它们是否会与 systemintern WebView 一样好。

  1. Chromeview : min-API 14 , 基于 Chromium 的, 看起来相当不错而且没有错误
  2. Geckoview : min-API 8,来自 Mozilla,可能有几个错误......
  3. Android-Chromium:从 github 中删除...
于 2014-06-12T11:25:05.013 回答
0

您可以为此使用 WebChrmeClient,无需进行任何 hack,下面的代码将适用于 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();
        }
    }
}
于 2014-06-13T04:45:59.043 回答