【问题标题】:Load onClick() method result in existing WebView加载 onClick() 方法导致现有的 WebView
【发布时间】:2015-05-01 01:42:42
【问题描述】:

我遇到了以下问题。 我创建了一个 WebView 应用程序。 WebView 加载一个网上商店。商店中的每个链接都在 WebView 中打开。到目前为止一切正常。

在操作栏中,我有一个搜索图标。搜索图标打开一个新的活动“搜索”。在这个活动中,我得到了一个编辑文本栏并创建了一个搜索 url,以在商店中搜索一些东西。

除此之外,一切正常,如果我单击搜索按钮,搜索结果将在浏览器中打开。我怎样才能存档这个,搜索结果会在我的主要活动网页视图中打开。

这里有一些代码。

打开搜索activity的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)

感谢任何帮助,我该如何解决这个问题。 问候

【问题讨论】:

    标签: android webview


    【解决方案1】:

    这里的基本问题是 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。除非该特定布局已在 Activity 中显示,否则无法通过 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>
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多