在现有WebView

时间:2015-04-30 09:39:22

标签: android webview

我遇到了以下问题。 我创建了一个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)

我感谢任何帮助,我怎么能解决这个问题。 迎接

1 个答案:

答案 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>

希望这有帮助!