Кнопка возврата веб-просмотра приложений Android

#java #android #webview

#java #Android #Веб-просмотр

Вопрос:

У меня есть веб-приложение, которое работает хорошо, но я не могу заставить кнопку возврата функционировать в веб-представлении. Пожалуйста, посмотрите код:

 package com.example;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.view.KeyEvent;

public class extends Activity
{
    final Activity activity = this;


    WebView WebView;
    public void onCreate(Bundle savedInstanceState)

    {
        super.onCreate(savedInstanceState);
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setUseWideViewPort(true);


        webView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress)
            {
                activity.setTitle("Loading...");
                activity.setProgress(progress * 100);

                if(progress == 100)
                    activity.setTitle(R.string.app_name);
            }
        });

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String     description, String failingUrl)
            {
            // Handle the error
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                view.loadUrl(url);
                return true;
            }
        });

        webView.loadUrl("http://www.example.com");
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (WebView != null amp;amp; (keyCode == KeyEvent.KEYCODE_BACK) amp;amp; WebView.canGoBack()) {
        WebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
    }
} 
  

Приложение запускается, но при нажатии кнопки возврата оно все равно выходит из приложения. Я также хочу добавить возможность использования тега html mailto в приложении. Любая помощь будет оценена. Спасибо.

Ответ №1:

Редактировать:

Включите проверку null, чтобы убедиться, что значение WebView равно null, прежде чем вызывать для него методы.

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (WebView != null amp;amp; (keyCode == KeyEvent.KEYCODE_BACK) amp;amp; WebView.canGoBack()) {
    WebView.goBack();
    return true;
}
  

Комментарии:

1. Попробовал запустить приложение. При нажатии кнопки «Назад» я получаю сообщение об ошибке принудительного закрытия Android, и оно выходит из приложения. Это произошло с обоими способами попытаться разрешить кнопку возврата.

2. Что LogCat сообщает вам о сбое. Это должно выдавать конкретную ошибку. Я также обновил свой код. Убедитесь, что вы запускаете его с помощью проверки if.

3. Я повторно запустил код. По-прежнему получена ошибка при использовании кнопки «Назад». В журнале сказано это: 10-25 20:17… E 3778 Andro… ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main Я запустил в режиме отладки, и кнопка возврата даже не выдала ошибку. Это просто заморозило приложение.

4. Хорошо, у вас есть какие-либо журналы, которые вы могли бы показать. Ошибка откуда-то еще; не в приведенном выше коде.

5. 10-25 20:17… E 3778 Andro… ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main 10-25 20:17… E 3778 Andro… java.lang. Исключение NullPointerException 10-25 20:17… E 3778 Andro… на com.webvientest. webvientest.onKeyDown(webvientest.java:59) 10-25 20:17… E 3778 Andro… на android.view. KevEvent.dispatch(KevEvent.java: 1042) 10-25 20:17… E 3778 Andro … в android.app.Activity.dispatchKeyEvent(Activity.java: 2068) 10-25 20:17… E 3778 Andro… в corn внутренняя политика Android irnpl PhoneUindo’$ DecorVie’ .dispatchKeyEuent(PhoneUindcv.

Ответ №2:

Ваш код кажется мне правильным. Какого именно поведения вы надеетесь добиться с помощью кнопки «Назад»?

Что происходит в настоящее время, когда вы запускаете приложение и нажимаете кнопку «Назад»?

Редактировать, о, я вижу, что происходит.

Вы пытаетесь переопределить onKeyDown() внутри вашего onCreate() . onKeyDown() и onCreate() являются методами Activity , поэтому вы не можете объявлять один внутри другого.

Попробуйте свой код следующим образом:

 package com.example;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.view.KeyEvent;

public class DealJargon extends Activity {
final Activity activity = this;


    WebView WebView;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.loadUrl("http://www.example.com");
    }




        WebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress){
                activity.setTitle("Loading...");
                activity.setProgress(progress * 100);

                if(progress == 100)
                   activity.setTitle(R.string.app_name);
            }

        });

        WebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String      description, String failingUrl){
                 // Handle the error
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url){
                view.loadUrl(url);
                return true;
            }
        });


  }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) amp;amp; WebView.canGoBack()) {
        WebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
    }
}
  

Редактировать 2: всякий раз, когда вы получаете какую-то ошибку компиляции, которая имеет какое-то отношение к фигурной скобке, вполне вероятно, что вы пытаетесь объявить метод внутри объявления другого метода. Или что-то подобное.

Комментарии:

1. Eclipse выдает мне сообщение об ошибке для удаления токена «}» в закрывающей скобке после: верните super.onKeyDown(код ключа, событие); Когда я удаляю, он сообщает, что код после недоступен. Я хотел, чтобы кнопка возврата функционировала как кнопка возврата в веб-браузере, открывающая предыдущие страницы. Я не смог запустить программу с тех пор, как добавил код для кнопки возврата.

2. Исправлена ошибка, и приложение работает как обычно. При нажатии кнопки возврата появляется ошибка Android: «Неожиданно остановлено — принудительное закрытие».

3. отредактируйте свой вопрос и включите трассировку стека, которую вы получаете при возникновении исключения.

4. Отредактировал вопрос, но сейчас я не получаю ошибку с кодом. Кнопка возврата завершает работу приложения, как это было до добавления кода keyevent.

5. Я понял это. Спасибо за помощь.