Реализуйте функцию Swipe в WebView и вызовите функцию Javascript через интерфейс Javascript.

Я хочу внедрить функции Swipe в свое приложение WebView и вызывать функции в Javascript приложения HTML/Javascript при выполнении салфетки.

Согласно ответу на эту проблему: Как обнаружить жест прокрутки в веб-просмотре

Я сделал что-то вроде этого:

package (...);

import (...)

public class MainActivity extends Activity {
    WebView mywebview;

public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mywebview = (WebView) findViewById(R.id.webview);

    WebSettings webSettings = mywebview.getSettings();
    mywebview.addJavascriptInterface(new WebAppInterface(this), "Android");

    webSettings.setJavaScriptEnabled(true);
    webSettings.setDatabaseEnabled(true);
    webSettings.setDatabasePath("/data/data/" + this.getPackageName() + "/databases/");
    webSettings.setDomStorageEnabled(true);
    mywebview.setWebChromeClient(new WebChromeClient());
    mywebview.setWebViewClient(new WebViewClient());
    mywebview.loadUrl("file:///android_asset/www/index.html");

    mywebview.setGestureDetector(new GestureDetector(new CustomeGestureDetector())); 

    }

private class CustomeGestureDetector extends SimpleOnGestureListener {      
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if(e1 == null || e2 == null) return false;
        if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
        else {
            try { // right to left swipe .. go to next page
                if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) {
                    mywebview.loadUrl("javascript:left()");
                    return true;
                } //left to right swipe .. go to prev page
                else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) {
                    mywebview.loadUrl("javascript:right()");
                    return true;
                } //bottom to top, go to next document
                else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800 
                        && mywebview.getScrollY() >= mywebview.getScale() * (mywebview.getContentHeight() - mywebview.getHeight())) {
                    mywebview.loadUrl("javascript:up()");
                    return true;
                } //top to bottom, go to prev document
                else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800 ) {
                    mywebview.loadUrl("javascript:down()");
                    return true;
                } 
            } catch (Exception e) { // nothing
            }
            return false;
        }
    }
}

public final class CustomWebView extends WebView {

    private GestureDetector gestureDetector;

    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public CustomWebView(Context context) {
        super(context);
    }

    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /* 
     * @see android.webkit.WebView#onScrollChanged(int, int, int, int)
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
    }

    /* 
     * @see android.webkit.WebView#onTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
    }

    public void setGestureDetector(GestureDetector gestureDetector) {
        this.gestureDetector = gestureDetector;
    }
}

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

 }

Но когда я запускаю приложение, в консоли появляется много ошибок, и приложение закрывается. Так что не так с моим кодом?

Вот журнал:

03-13 12:09:19.944: E/AndroidRuntime(311): FATAL EXCEPTION: main
03-13 12:09:19.944: E/AndroidRuntime(311): java.lang.RuntimeException: Unable to start activity ComponentInfo{packagename/packagename.ActivityName}: java.lang.ClassCastException: android.webkit.WebView
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.os.Looper.loop(Looper.java:123)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-13 12:09:19.944: E/AndroidRuntime(311):  at java.lang.reflect.Method.invokeNative(Native Method)
03-13 12:09:19.944: E/AndroidRuntime(311):  at java.lang.reflect.Method.invoke(Method.java:521)
03-13 12:09:19.944: E/AndroidRuntime(311):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-13 12:09:19.944: E/AndroidRuntime(311):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-13 12:09:19.944: E/AndroidRuntime(311):  at dalvik.system.NativeStart.main(Native Method)
03-13 12:09:19.944: E/AndroidRuntime(311): Caused by: java.lang.ClassCastException: android.webkit.WebView
03-13 12:09:19.944: E/AndroidRuntime(311):  at packagename.ActivityName.onCreate(ActivityName.java:47)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-13 12:09:19.944: E/AndroidRuntime(311):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-13 12:09:19.944: E/AndroidRuntime(311):  ... 11 more

Мой файл XML (activity.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<WebView
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
 </RelativeLayout>

person jojosch    schedule 13.03.2013    source источник
comment
Пожалуйста, покажите вывод logcat. Там вы увидите трассировку стека, которая показывает, почему ваше приложение закрыто.   -  person Olaf Dietsche    schedule 13.03.2013
comment
Только что обновил проблему с логом   -  person jojosch    schedule 13.03.2013
comment
Покажите полный файл ресурсов для R.layout.activity_main и R.id.webview.   -  person Olaf Dietsche    schedule 13.03.2013
comment
Обновлено... Und wenn Sie/Du wirklich aus Deutschland kommen/kommst, kann die Antwort auch gern auf Deutsch erfolgen.   -  person jojosch    schedule 13.03.2013
comment
Я из Германии. Но если я дам ответ только на немецком языке, многие читатели не смогут последовать за мной и поправить меня, если я скажу какую-нибудь ерунду. ;-)   -  person Olaf Dietsche    schedule 13.03.2013
comment
Это выглядит довольно стандартно. Единственная придирка, которую я имею, вы загружаете activity_main, но ваш файл ресурсов называется activity.xml. Это опечатка или у вас есть другой файл ресурсов activity_main.xml?   -  person Olaf Dietsche    schedule 13.03.2013
comment
Нет, это опечатка, я просто переименовал эти файлы для stackoverflow. В Eclipse эти ошибки отображаются для строки: mywebview.setGestureDetector(new GestureDetector(new CustomeGestureDetector())); : - Метод setGestureDetector(GestureDetector) не определен для типа WebView - Конструктор GestureDetector(GestureDetector.OnGestureListener) устарел   -  person jojosch    schedule 13.03.2013
comment
Строка 47 - это mywebview.setGestureDetector(...)?   -  person Olaf Dietsche    schedule 13.03.2013
comment
Хорошо, я должен изменить эту строку на: ((CustomWebView) mywebview).setGestureDetector(new GestureDetector(new CustomeGestureDetector())); иначе не запустится, но да, это строка 47   -  person jojosch    schedule 13.03.2013
comment
Не преобразовывайте mywebview в CustomWebView, потому что это не одно. Если вы хотите пойти по этому пути, вы также должны изменить его в файле activity_main.xml.   -  person Olaf Dietsche    schedule 13.03.2013
comment
Это было Quick Fix, предполагаемое Eclipse и Android SDK. Со строкой mywebview.setGestureDetector(...) приложение не запускается.   -  person jojosch    schedule 13.03.2013