Java 向Android应用程序WebView添加后退按钮/主页功能和外部浏览器

Java 向Android应用程序WebView添加后退按钮/主页功能和外部浏览器,java,android,xml,webview,Java,Android,Xml,Webview,我已经尝试了很多方法,并且在我的Android应用程序上不断收到一个崩溃错误。我的应用程序是一个使用webview功能的简单webwrapper应用程序。基本上,我有一个webview显示一个有移动站点的网站。我想做的是让它 后退按钮将使用户返回上一屏幕 我在布局中放置的应用程序上的后退按钮也会将用户带到上一个屏幕。 我还希望手机上的home(主页)按钮返回主屏幕并完全退出应用程序。 最后,移动应用程序具有外部链接,这些链接应该进入浏览器,而不是停留在应用程序内例如:访问完整站点。 下面是我的代

我已经尝试了很多方法,并且在我的Android应用程序上不断收到一个崩溃错误。我的应用程序是一个使用webview功能的简单webwrapper应用程序。基本上,我有一个webview显示一个有移动站点的网站。我想做的是让它

后退按钮将使用户返回上一屏幕 我在布局中放置的应用程序上的后退按钮也会将用户带到上一个屏幕。 我还希望手机上的home(主页)按钮返回主屏幕并完全退出应用程序。 最后,移动应用程序具有外部链接,这些链接应该进入浏览器,而不是停留在应用程序内例如:访问完整站点。 下面是我的代码,任何关于1-4个问题的帮助都会很有帮助!:-!如果您需要查看我的XML,请尽管问

package com.example.envision;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class Envision extends Activity {
/** back button functionality NOT WORKING CAUSES A CRASH
WebView webview;
@Override
   public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                if(webview.canGoBack() == true){
                    webview.goBack();
                } else {
                    finish();
                }
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    } */

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_envision);

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

WebSettings websettings = webview.getSettings();

websettings.setJavaScriptEnabled(true);
websettings.setSaveFormData(false);
websettings.setSavePassword(false);

webview.loadUrl("http://envisionfinancial.ca/m/");
webview.setHorizontalScrollBarEnabled(false);
webview.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
webview.setBackgroundColor(128);

webview.setWebViewClient(new EnvisionWebViewClient());

webview.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent,
            String contentDisposition, String mimetype,
            long contentLength) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        }


});

}

public void visible(){

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

ImageView logo = (ImageView) findViewById(R.id.imageView1);

ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);

webview.setVisibility(10);

logo.setVisibility(0);

bar.setVisibility(0);

}

public void unvisible(){

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

ImageView logo = (ImageView) findViewById(R.id.imageView1);

ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);

webview.setVisibility(0);

logo.setVisibility(10);

bar.setVisibility(10);

}


private class EnvisionWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView webview, String url){
    webview.loadUrl(url);
    return true;
}


@Override
public void onReceivedError(WebView view, int errorCode,
    String description, String failingUrl) {
// TODO Auto-generated method stub
view.loadUrl("http://envisionfinancial.ca/m/");
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {

visible();

}

@Override
public void onPageFinished(WebView view, String url) {

unvisible();

}

}
/** exits the app?? review */
public void finishActivity(View v) {
finish();

}
}
见此:

滚动到将JavaScript代码绑定到Android代码


在onKeyDown中是否有NullPointerException?这是因为您没有将WebView分配给实例变量:

webview = (WebView) findViewById(R.id.webView1);
后台功能的实现方式如下:

public void onBackPressed() {
    if (webview.canGoBack())
        webview.goBack();
    else
        super.onBackPressed();
}

您提供的后台功能代码去了哪里?在onCreate之前的活动中?我在onCreate之前但在活动中添加了代码,导致其冻结。@user1834155重写了活动中的一个方法,因此是的,它应该放在活动中,但位置无关紧要。太棒了,返回按钮起作用了,是WebView对实例变量的错误:-D!