2016-07-19 11 views
1

aufzurufen Meine App lädt das Fragment mit dem WebView in es, aber wenn ich versuche, die Zurück-Taste drücken. Es stürzt ab und sagt, das Web ist null. Ich weiß nicht warum. Bitte helfen Sie. Kann ich einen Accessor wieVersuch, virtuelle Methode 'boolean android.webkit.WebView.canGoBack()' auf einem Nullobjekt Referenz

im WebViewFragment verwenden

MainActivity

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.webkit.WebView; 

public class MainActivity extends FragmentActivity { 

    WebView mWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     WebViewFragment webViewFragment = new WebViewFragment(); 
     fragmentTransaction.replace(R.id.mainFragment, webViewFragment); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    public void onBackPressed() { 

      if(mWebView.canGoBack()) { 
       mWebView.goBack(); 

      } 
    else 
     { 
      super.onBackPressed(); 
     } 
    } 

} 

WebViewFragment

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class WebViewFragment extends Fragment { 

    private WebView mWebView; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main, container, false); 

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

     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     mWebView.loadUrl("https://www.google.co.uk/"); 
     mWebView.setWebViewClient(new WebViewClient()); 

     return view; 
    } 

} 

Antwort

0

Ihre mWebView innerhalb WebViewFragment.java definiert ist, mWebView in MainActivity.java ist ein anderes Objekt und der Wert ist null. So wird mWebView.canGoBack() Fehler erhalten, weil mWebView ein Null-Objekt ist.

Sie onBackPressed() in MainActivity.java ändern sollten, z.B .:

@Override 
public void onBackPressed() { 
    Fragment webview = getSupportFragmentManager().findFragmentByTag("webview"); 

    if ((webview instanceof WebViewFragment) && WebViewFragment.canGoBack()) { 
      WebViewFragment.goBack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Fügen Sie außerdem einen einzigartigen Fragment-Tag zum dritten Argumente der Linie fragmentTransaction.replace(...) in MainActivity.java identifizieren, z.B. "Webansicht":

fragmentTransaction.replace(R.id.mainFragment, webViewFragment, "webview"); 

Dann machen mWebView statisch innen class WebViewFragment:

private static WebView mWebView; 

und stellen Sie sicher, Sie haben dieses Bild 2 statische Methoden innerhalb class WebViewFragment definiert:

public static boolean canGoBack(){ 
    return myWebView.canGoBack(); 
} 

public static void goBack(){ 
    myWebView.goBack(); 
}