WebViewClient 和 onKeyDown 的问题
Problems with WebViewClient and onKeyDown
我目前正在尝试制作一个基于 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"class也在这下面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
试试这个
@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);
我会省略这句话:
WebView webview = new WebView(this);
您不需要像那样构建 WebView,浏览器 activity class 中的 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()。
我目前正在尝试制作一个基于 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"class也在这下面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
试试这个
@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);
我会省略这句话:
WebView webview = new WebView(this);
您不需要像那样构建 WebView,浏览器 activity class 中的 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()。