我目前正在尝试制作基于WebView的应用程序。
这是我目前的代码:
WebView webview = new WebView(this);
setContentView(webview);
WebView webView = (WebView) findViewById(R.id.myWebView);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setLoadsImagesAutomatically(true);
webView.setWebViewClient(new NewWebViewClient());
webview.loadUrl("http://google.com");
“NewWebViewClient”类也在MainActivity.java
中public class NewWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Android Studio未显示任何错误。 但如果我想在智能手机上启动应用程序,它就会崩溃。
我遇到同样的问题:
public void onKeyDown() {
WebView webView = (WebView) findViewById(R.id.myWebView);
if (webView.copyBackForwardList().getCurrentIndex() > 0) {
webView.goBack();
}
else {
super.onBackPressed();
}
}
有谁知道如何让这两件事情都有效?
修改
它仍然崩溃:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.setWebViewClient(android.webkit.WebViewClient)' on a null object reference
答案 0 :(得分:1)
试试这个
@Override
public void onBackPressed() {
WebView webView = (WebView) findViewById(R.id.myWebView);
if(webView!=null)
{
if(webView.canGoBack())
{
webView.goBack();
}
else
{
super.onBackPressed();
}
}
}
在阅读了你的问题之后,我认为当用户按下后退按钮时你需要执行返回...如果你知道你可以使用上面的代码......
并替换
WebView webview = new WebView(this);
与
WebView webView = (WebView) findViewById(R.id.myWebView);
答案 1 :(得分:0)
我会省略这句话:
WebView webview = new WebView(this);
您不需要像这样构造WebView,浏览器活动类中的onCreate()事件将负责启动对象。 然后,而不是调用setContentView()引用你构建的webview:
setContentView(webview);
请参阅包含WebView的布局,例如:
setContentView(R.layout.browser);
然后您可以通过其ID引用WebView。 我认为问题是findViewById()没有通过其ID找到WebView, 因为您之前没有设置包含具有该ID的元素的布局。 这是通过setContentView()实现的。 FindViewById()方法需要知道在哪个视图中查找具有特定ID的元素,例如,有时您需要首先对视图进行膨胀(替换为setContentView):
View v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.some_layout, null);
然后针对此视图调用findViewById以在布局中找到元素:
v.findViewById(R.id.element_id);
因此,如果通过setContentView()设置视图,首先指向布局,则使用不带视图前缀的findViewById(),如果通过LayoutInflater对视图进行了膨胀,则使用view.findViewById()语法,而不使用setContentView( )。