我遇到了以下问题。 我创建了一个WebView应用程序。 WebView加载了一个网上商店。商店中的每个链接都在WebView中打开。到目前为止一切正常。
在操作栏中,我找到了一个搜索图标。搜索图标将打开一个新活动“搜索”。在这个活动中,我得到了一个edittext栏并创建了一个搜索网址,以搜索商店中的某个开头。
一切正常,如果我点击搜索按钮,搜索结果将在浏览器中打开。如何归档此搜索结果将在我的主要活动webview中打开。
这是一些代码。
用于打开搜索活动的onClick方法:
public void openSearch(){
Intent intent = new Intent(MainActivity.this, SearchActivity.class);
startActivity(intent);
}
在搜索活动中执行搜索的代码:
public void performSearch(View view){
String searchURL = "http://interneturl.de/search?page=search&page_action=query&desc=on&sdesc=on&keywords";
EditText editText = (EditText)findViewById(R.id.searchEditText);
WebView webView = (WebView)findViewById(R.id.start_webview);
Button button = (Button)findViewById(R.id.ButtonSearch);
if(button.isPressed()){
//load webView from MainActivity
webView.loadUrl(searchURL+"="+editText.getText().toString());
System.out.println("********************************************Button is pressed!!!!");
}
}
在
WebView webView = (WebView)findViewById(R.id.start_webview);
在MainActivity中创建
public void openMorrisAntikshop() {
webView = (WebView) findViewById(R.id.start_webview); [....]
但如果我点击按钮进行搜索,我就会崩溃。
Process: com.csdevelopment2014.morrisantikshop, PID: 16750
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java)
at android.view.View.performClick(View.java)
at android.view.View$PerformClick.run(View.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java)
at android.view.View.performClick(View.java)
at android.view.View$PerformClick.run(View.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.loadUrl(java.lang.String)' on a null object reference
at com.csdevelopment2014.morrisantikshop.SearchActivity.performSearch(SearchActivity.java:52)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java)
at android.view.View.performClick(View.java)
at android.view.View$PerformClick.run(View.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
我感谢任何帮助,我怎么能解决这个问题。 迎接
答案 0 :(得分:0)
这里的基本问题是SearchActivity.class中的行WebView webView = (WebView)findViewById(R.id.start_webview);
无法找到您引用的WebView。这是因为只有在父视图被该活动夸大的情况下才能找到您在MainActivity.class中使用的具有id R.id.start_webview的WebView。基本上,在MainActivity.class中,您调用setContentView
并在该布局中的某个位置使用了ID为R.id.start_webview的WebView。除非在活动中显示了特定的布局,否则无法通过id找到此WebView。从MainActivity.class引用WebView的唯一方法是,如果您从SearchActivity.class显式引用了在MainActivity.class中创建的WebView。
解释了为什么您的代码无法运行,让我告诉您正确的解决方案。您应该使用Intents,而不是尝试引用在MainActivity.class中创建的WebView。这些允许活动像您尝试的那样进行通信。您需要做的是创建一个显式Intent,用SearchActivity.class打开MainActivity.class和搜索数据,然后在正确的WebView中加载数据。这是一个简单的解决方案,包含MainActivity.class和SearchActivity.class的代码:
MainActivity.class
private WebView mWebView;
public void openMorrisAntikshop() {
mWebView = (WebView) findViewById(R.id.start_webview);
}
public void loadUrl(String url) {
if(mWebView != null) {
// Perform the search
mWebView.loadUrl(url);
}
}
@Override
public void onNewIntent(Intent intent) {
// Handle a new intent coming in, retrieve the URL
String url = intent.getDataString();
loadUrl(url);
}
SearchActivity.class
private static final String SEARCH_URL = "http://interneturl.de/search?page=search&page_action=query&desc=on&sdesc=on&keywords=";
public void performSearch(View view) {
EditText editText = (EditText)findViewById(R.id.searchEditText);
Button button = (Button)findViewById(R.id.ButtonSearch);
String search = editText.getText().toString();
if(button.isPressed()) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(SEARCH_URL + search), this, MainActivity.class));
}
}
注意:您需要在Android清单中注册MainActivity.class以处理您的URL的ACTION_VIEW意图。将它放在MainActivity.class的标签中:
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
<data android:host="interneturl.de" android:scheme="http"></data>
</intent-filter>
希望这有帮助!