Есть ли способ заставить работать веб-представление Android 4.0 на приемлемом уровне? - PullRequest
7 голосов
/ 28 марта 2012

И на эмуляторе, и на моем устройстве galaxy nexus это простое демонстрационное приложение занимает целых 1000 миллисекунд или дольше, чтобы установить или снять флажок. Я хотел написать большую часть своего приложения на javascript, чтобы можно было повторно использовать код в ios / android / web, но это нарушает условия сделки.

Вот мой код:

(Активность)

package com.mycompanyname;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.mycompanyname.R;

public class JavascriptListViewTestActivity extends Activity {
    private JavascriptListViewTestActivity parent = this;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);            

        WebChromeClient chrome = new WebChromeClient() {
            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                parent.showDialog(consoleMessage.message() + "\n" + consoleMessage.lineNumber());
                return true;
            }
        };

        WebViewClient client = new WebViewClient() {

        };

        WebView webView = (WebView)findViewById(R.id.webView1);
        webView.setWebChromeClient(chrome);
        webView.setWebViewClient(client);

        webView.getSettings().setJavaScriptEnabled(false);
        webView.getSettings().setAllowFileAccess(false);
        webView.getSettings().setAppCacheEnabled(false);
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setDatabaseEnabled(false);
        webView.getSettings().setDomStorageEnabled(false);
        webView.getSettings().setGeolocationEnabled(false);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
        webView.getSettings().setLightTouchEnabled(false);
        webView.getSettings().setLoadWithOverviewMode(false);
        webView.getSettings().setNavDump(false);
        webView.getSettings().setNeedInitialFocus(false);
        webView.getSettings().setPluginsEnabled(false);
        webView.getSettings().setRenderPriority(RenderPriority.HIGH);
        webView.getSettings().setSaveFormData(false);
        webView.getSettings().setSavePassword(false);
        webView.getSettings().setSupportMultipleWindows(false);
        webView.getSettings().setSupportZoom(false);
        webView.getSettings().setUseDoubleTree(false);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

        String html = readText(R.raw.listview);

        webView.loadData(html, "text/html", "UTF-8");

    }

    private void showDialog(String message)
    {
        AlertDialog alert = new AlertDialog.Builder(parent).create();
        alert.setMessage(message);
        alert.show();
    }

    private String readText(int resourceId) 
    {
        InputStream is = this.getResources().openRawResource(resourceId);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String readLine = null;
        StringBuffer outputBuffer = new StringBuffer();

        try 
        {
            while ((readLine = br.readLine()) != null) 
            {
                outputBuffer.append(readLine);
            }
            return outputBuffer.toString();
        } 
        catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        finally 
        {
            // TODO: might throw - use IOUtils.close()
            try 
            {
                is.close();
                br.close();
            } 
            catch (IOException ex) 
            {
                showDialog(ex.toString());
            }
        }
    }
}

(XML-макет)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

(HTML, загруженный в веб-просмотр)

<html>
<body>

<input type="checkbox" />

</body>
</html>

1 Ответ

2 голосов
/ 10 мая 2013

Я понимаю, что этому больше года, но вы можете попробовать реализовать fastclick.js: https://github.com/ftlabs/fastclick

Я успешно использовал его на нескольких проектах. Как объясняет страница:

... мобильные браузеры будут ждать приблизительно 300 мс с момента Вы нажимаете кнопку, чтобы запустить событие щелчка. Причиной этого является что браузер ждет, чтобы увидеть, действительно ли вы выполняете двойное нажатие.

То же самое касается взаимодействий в веб-просмотре (насколько я знаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...