2015-07-10 25 views
2

我有一個應用程序,加載一個網頁在web視圖中。它加載網頁不錯,但在旋轉它崩潰了約一個空指針的onSaveInstanceState中的錯誤(線82)WebView應用程序在旋轉時崩潰將onSaveInstanceState空null異常

package uk.co.grcade.grcade; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.net.Uri; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.MotionEvent; 
import android.view.View; 
import android.webkit.DownloadListener; 
import android.webkit.ValueCallback; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

import java.net.URI; 
import java.net.URL; 

public class MainActivity extends ActionBarActivity { 


    private WebView view; 

    //Main WebView Panel Start 
    @Override 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState != null) 
     { 
      //view.restoreState(savedInstanceState); 
     } else { 

      String url = "http://grcade.co.uk"; 
      WebView view = (WebView) this.findViewById(R.id.webView); 
      view.getSettings().setJavaScriptEnabled(true); 
      view.loadUrl(url); 
      view.getSettings().setSupportZoom(true); 
      view.getSettings().setBuiltInZoomControls(true); 
      view.getSettings().setDisplayZoomControls(false); 
      view.getSettings().setLoadWithOverviewMode(true); 

      view.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return false; 
       } 
      }); 

      view.setBackgroundColor(Color.TRANSPARENT); 

      view.setDownloadListener(new DownloadListener() { 
       public void onDownloadStart(String url, String userAgent, 
              String contentDisposition, String mimetype, 
              long contentLength) { 
        Intent i = new Intent(Intent.ACTION_VIEW); 
        i.setData(Uri.parse(url)); 
        startActivity(i); 
       } 


      }); 
     } 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     view.saveState(outState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) 
    { 
     super.onRestoreInstanceState(savedInstanceState); 
     view.restoreState(savedInstanceState); 
    } 

    //Main WebView Panel End 

    //Refresh button on top bar Start 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     WebView view=(WebView) this.findViewById(R.id.webView); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_refresh){ 
      view.reload(); 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    //Refress Button on time bar End 

    //Start Back Button Back Page 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     WebView view = (WebView) this.findViewById(R.id.webView); 
     if(event.getAction() == KeyEvent.ACTION_DOWN){ 
      switch(keyCode) 
      { 
       case KeyEvent.KEYCODE_BACK: 
        if(view.canGoBack()){ 
         view.goBack(); 
        }else{ 
         finish(); 
        } 
        return true; 
      } 

     } 
     return super.onKeyDown(keyCode, event); 
    } 

    //End Back Button Back Page 


} 

我是新來的應用,因此很漂亮這一切失去了。 任何幫助非常感謝。

+0

下一次,當應用程序崩潰總是粘貼的logcat的問題。 – krystian71115

回答

3
public void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // and now set the view variable: 
     this.view = (WebView) findViewById(R.id.webView); 
     // not WebView view ! 
     // ... 
} 

我希望它對你有所幫助。

問題是你沒有設置視圖變量。

編輯:

package uk.co.grcade.grcade; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.net.Uri; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.MotionEvent; 
import android.view.View; 
import android.webkit.DownloadListener; 
import android.webkit.ValueCallback; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

import java.net.URI; 
import java.net.URL; 

public class MainActivity extends ActionBarActivity { 


    private WebView view; 

    //Main WebView Panel Start 
    @Override 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     this.view = (WebView) findViewById(R.id.webView); 

     view.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
       } 
      }); 
     view.setDownloadListener(new DownloadListener() { 
       public void onDownloadStart(String url, String userAgent, 
              String contentDisposition, String mimetype, 
              long contentLength) { 
        Intent i = new Intent(Intent.ACTION_VIEW); 
        i.setData(Uri.parse(url)); 
        startActivity(i); 
       } 


      }); 

     if(savedInstanceState == null){ 

      String url = "http://grcade.co.uk"; 
      view.getSettings().setJavaScriptEnabled(true); 
      view.loadUrl(url); 
      view.getSettings().setSupportZoom(true); 
      view.getSettings().setBuiltInZoomControls(true); 
      view.getSettings().setDisplayZoomControls(false); 
      view.getSettings().setLoadWithOverviewMode(true); 

      view.setBackgroundColor(Color.TRANSPARENT); 

     } 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     view.saveState(outState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) 
    { 
     super.onRestoreInstanceState(savedInstanceState); 
     view.restoreState(savedInstanceState); 
    } 

    //Main WebView Panel End 

    //Refresh button on top bar Start 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     WebView view=(WebView) this.findViewById(R.id.webView); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_refresh){ 
      view.reload(); 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    //Refress Button on time bar End 

    //Start Back Button Back Page 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     WebView view = (WebView) this.findViewById(R.id.webView); 
     if(event.getAction() == KeyEvent.ACTION_DOWN){ 
      switch(keyCode) 
      { 
       case KeyEvent.KEYCODE_BACK: 
        if(view.canGoBack()){ 
         view.goBack(); 
        }else{ 
         finish(); 
        } 
        return true; 
      } 

     } 
     return super.onKeyDown(keyCode, event); 
    } 

    //End Back Button Back Page 


} 
+0

工作就像一個治療!感謝:) –

+0

但是,從這一點出來的東西是,雖然旋轉工程的一種享受,如果你最小化應用程序(主頁按鈕),並重新打開所有的鏈接不可點擊,直到你旋轉並旋轉回來刷新它似乎resotre沒有正確地發生,有什麼我應該包括所有這些工作? –

+0

@KelvinBrotherston試試這個答案:http://stackoverflow.com/a/11859770/2536878 – krystian71115

2
<activity name= ".YourActivity" android:configChanges="orientation|screenSize"/> 

檢查清單檔案中的第一個。

刪除線

view.saveState(outState); & 
view.restoreState(savedInstanceState); 
相關問題