2013-07-01 2 views
1

뒤로 버튼이 작동하지 않고 null 포인터 예외가 발생하는 웹보기가 있습니다. 단일 활동을 사용하고로드 할 URL의 의도를 확인하고 있습니다. 링크를 여는 데는 모든 기능이 정상적으로 작동합니다. 뒤로 버튼은 webview에서 이전 페이지로 돌아 가지 않고 작업을 중단시킵니다.Android Webview - 뒤로 버튼이 작동하지 않습니다.

EDITTED : 아래의 코드 블록이 업데이트되었습니다. 어떤 도움을 주시면 감사하겠습니다

07-01 11:54:19.817: E/AndroidRuntime(10079): FATAL EXCEPTION: main 
07-01 11:54:19.817: E/AndroidRuntime(10079): java.lang.NullPointerException 
07-01 11:54:19.817: E/AndroidRuntime(10079): at com.app.browser.WebUrl.onBackPressed(WebUrl.java:70) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.app.Activity.onKeyUp(Activity.java:2163) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.view.KeyEvent.dispatch(KeyEvent.java:2651) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.app.Activity.dispatchKeyEvent(Activity.java:2393) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1853) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3683) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3653) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2893) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.os.Looper.loop(Looper.java:137) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at android.app.ActivityThread.main(ActivityThread.java:5059) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at java.lang.reflect.Method.invokeNative(Native Method) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at java.lang.reflect.Method.invoke(Method.java:511) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
07-01 11:54:19.817: E/AndroidRuntime(10079): at dalvik.system.NativeStart.main(Native Method) 

: 아직도 널 포인터 예외를

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class WebUrl extends Activity { 

WebView myWebview; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.webview); 
Bundle extras = getIntent().getExtras(); 

if(extras != null) { 
    String link = extras.getString("url"); 
    WebView myWebview = (WebView) findViewById(R.id.webEngine); 

    myWebview.getSettings().setJavaScriptEnabled(true); 
    myWebview.getSettings().setSupportZoom(true) ; 
    myWebview.getSettings().setUseWideViewPort(true) ; 
    myWebview.getSettings().setLoadWithOverviewMode(true); 
    myWebview.getSettings().setBuiltInZoomControls(true); 
    myWebview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    myWebview.setScrollbarFadingEnabled(false); 

    // Load the URLs inside the WebView, not in the external web browser 
    myWebview.setWebViewClient(new WebViewClient()); 

       if (savedInstanceState == null) { 
      // Load a page 
      myWebview.loadUrl(link); 
     } 
     } 
    } 

@Override 
public void onBackPressed() { 
    if(myWebview.canGoBack() == true) { 
     myWebview.goBack(); 
    } else { 
     WebUrl.super.onBackPressed(); //Replace MyActivity With the name of your activity. 
    } 
} 
} 

로그 캣 오류를 제공합니다.

감사합니다,

+0

클래스로 'myWebview' 선언 가능 – Raghunandan

답변

0

myWebview가 제대로 초기화되지 않았습니다.

myWebView

은 다음 두 가지 조건이

if(extras !=null) 

if(link.equals("http://www.google.com")) 

그래서 어떻게 든 어떤이 두 조건에 해당하는 경우 초기화하는 것은 거짓입니다. 따라서 변수는 초기화되지 않습니다. 결과적으로 null이고 예외가 throw됩니다.

1

처음에는 onBackPressed 메서드가 클래스 외부에 있습니다. 그것이 널 포인터를 던지는 이유입니다. 나는 실제로 이것을 컴파일하고 도망쳐 서 실제로 놀랐습니다.

하지만이 작업을 복잡하게하는 방법은 아니며, 두 개의 개별 웹 페이지에 대해 해당 코드를 모두 복제 할 필요가 없습니다. 사용자가 이동 어떤 웹 페이지, 당신은에 따라 특정 설정을 변경할 수 있습니다 거기에서

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class WebUrl extends Activity { 

    WebView myWebview; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webview); 
     Bundle extras = getIntent().getExtras(); 

     if(extras != null) { 
      String link = extras.getString("url"); 
      WebView myWebview = (WebView) findViewById(R.id.webEngine); 

      myWebview.getSettings().setJavaScriptEnabled(true); 
      myWebview.getSettings().setSupportZoom(true) ; 
      myWebview.getSettings().setUseWideViewPort(true) ; 
      myWebview.getSettings().setLoadWithOverviewMode(true); 
      myWebview.getSettings().setBuiltInZoomControls(true); 
      myWebview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
      myWebview.setScrollbarFadingEnabled(false); 

      // Load the URLs inside the WebView, not in the external web browser 
      myWebview.setWebViewClient(new WebViewClient()); 

      if (savedInstanceState == null) { 
       // Load a page 
       myWebview.loadUrl(link); 
      } 
     } 

     @Override 
     public void onBackPressed() { 
      if(myWebview.canGoBack() == true) { 
       myWebview.goBack(); 
      } else { 
       MyActivity.super.onBackPressed(); //Replace MyActivity With the name of your activity. 
      } 
     } 
    } 
} 

: 그것은 내가이 코드를 사용하는 것이이 경우에, 당신은 동일 구글과 모질라 모두에 대해이 설정처럼 보인다.

+0

확인. 나는 너의 제안을 사용했다. mywebview.loadurl (링크) 다음에 닫힌 브라켓이 누락되었습니다. 나는 그것을 저장하고, 프로젝트를 청소하고 그것을 달렸고 여전히 위와 같은 nullpointer를 제공한다. – user1443402

+0

어떤 라인에서 널 포인터 예외가 발생합니까? MyActivity.super.onBackPressed() 대신에'super.onBackPressed()'를 사용할 필요가 있습니다. MyActivity는 현재 액티비티의 이름입니다. 또한 엑스트라가 실제로 null이 아님을 확인하기 위해 로그 인쇄를하고 싶을 수도 있습니다. –

+0

위에서 수정 한 것을 사용하여 MyActivity를이 Java 클래스 이름 인 WebUrl로 변경했거나 MainActivity 여야합니까? 줄 41에주는 오류 : – user1443402

3

WebView myWebview = (WebView) findViewById(R.id.webEngine);

해야

myWebview = (WebView) findViewById(R.id.webEngine);

당신의 새로운 웹보기를 선언하는 당신의 블록이 다음합니다 (onBackPressed에 (인스턴스화되지 않았다) 클래스 변수 myWebView을 참조하려고하는 경우) . 클래스 변수를 항상 사용하고 싶다면 this.myWebView를 모든 경우에 사용할 수도 있습니다.

+0

또한'extras == null' 인 경우에 대한 추가 로직을 추가해야합니다. 여기서 달성하고자하는 것이 확실하지 않지만, 바로 extras == null 인 경우 사용자는 그냥 빈 웹보기를 참조하십시오. – invertigo

+0

글쎄 그게 해결 된 것 같습니다. 단지 처음에 Webview를 제거합니다. 저것과 Davids 제안 사이에서 지금 제대로 작동하고 있습니다. – user1443402

+1

이것이 문제를 해결 한 해결책이라면 답을 표시해주세요. 감사. – invertigo

관련 문제