#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. Я понял это. Спасибо за помощь.