سؤال

Android app gives me an error now:

package com.martijngijselaar.rooster;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebviewActivity extends MainActivity {

    private WebView myWebView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        WebView myWebView = (WebView)findViewById(R.id.webview);

        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        myWebView.setWebViewClient(new WebViewClient());

        myWebView.requestFocus(View.FOCUS_DOWN);
        myWebView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_UP:
                        if (!v.hasFocus()) {
                            v.requestFocus();
                        }
                        break;
                }
                return false;
            }
        });
    }   

    public void onResume() {
        super.onResume();
        if ( isOnline() == true )
            myWebView.loadUrl(webLink);
        else if ( isOnline() == false )
            showNoConnectionDialog();
    }
}

And this is the logcat:

11-25 12:33:34.697: E/AndroidRuntime(494): FATAL EXCEPTION: main 11-25 12:33:34.697: E/AndroidRuntime(494): java.lang.RuntimeException: Unable to resume activity {com.martijngijselaar.rooster/com.martijngijselaar.rooster.WebviewActivity}: java.lang.NullPointerException 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.os.Handler.dispatchMessage(Handler.java:99) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.os.Looper.loop(Looper.java:123) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.main(ActivityThread.java:4627) 11-25 12:33:34.697: E/AndroidRuntime(494): at java.lang.reflect.Method.invokeNative(Native Method) 11-25 12:33:34.697: E/AndroidRuntime(494): at java.lang.reflect.Method.invoke(Method.java:521) 11-25 12:33:34.697: E/AndroidRuntime(494): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 11-25 12:33:34.697: E/AndroidRuntime(494): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 11-25 12:33:34.697: E/AndroidRuntime(494): at dalvik.system.NativeStart.main(Native Method) 11-25 12:33:34.697: E/AndroidRuntime(494): Caused by: java.lang.NullPointerException 11-25 12:33:34.697: E/AndroidRuntime(494): at com.martijngijselaar.rooster.WebviewActivity.onResume(WebviewActivity.java:46) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.Activity.performResume(Activity.java:3823) 11-25 12:33:34.697: E/AndroidRuntime(494): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118) 11-25 12:33:34.697: E/AndroidRuntime(494): ... 12 more

Blockquote

هل كانت مفيدة؟

المحلول

You are really close. You just need to move the code that loads the url into onResume:

public void onResume(){
super.onResume();
 if ( isOnline() == true )
            myWebView.loadUrl(webLink);
}

onResume is called right after onCreate so it will be called in both the case where it's the first load and when coming back from the pause.

Update based on discussion in the comments: To move the web view to an instance variable:

public class WebviewActivity extends MainActivity {

  private WebView myWebView;

  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    myWebView = (WebView)findViewById(R.id.webview);
     //the rest of your onCreate method here)
    }
  }

نصائح أخرى

Basically you just need to look at the Activity Lifecycle flow.

Just leave the initializations in onCreate and check for the WIFI and launch dialog in onResume.

You are doing right creating all the stuff in the onCreate. onResume is executed when you turn on screen and device wakes up, so think about the logical stuff you should do then: refresh graphics which need to be refreshed, restart bluetooth or wifi communications if they were shut down, etc

Have a look at the schema of Activities lifecicles in Android Developers to learn how this works.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top