21

Hier ist ein Code für eine Basis Fragment, die eine WebView enthält.
WebFragment.java
WebView wird neu geladen, wenn Fragment in ViewPager beibehalten wird BackStack

public class WebFragment extends Fragment { 
String TAG = "WebFragment"; 
private WebView webView; 
private String currentUrl = "http://www.google.com"; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.webview_layout, null); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    webView = (WebView) getView().findViewById(R.id.helloWebview); 
    initWebView(); 
    webView.loadUrl(currentUrl); 
} 

@SuppressLint("SetJavaScriptEnabled") 
private void initWebView() { 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT"); 
    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.e(TAG, "Loding..."); 
      super.onPageStarted(view, url, favicon); 
     } 
    }); 
} 

class JavaScriptInterface { 
    public void showHTML(String html) { 
    } 
} 
} 

Ich habe 2 basische Fragmente auch (die WebView nicht hat). Dann setze ich all diese 3 Fragments in ViewPager (WebFragment, Fragment1 bzw. Fragment2) unter Verwendung FragmentAdapter. Und ich fügte hinzu android:configChanges="orientation|screenSize" in AndroidManifest.xml (So WebView wird nicht realod auf Konfiguration ändern).
Jetzt ist mein Problem, während laufender App habe ich die 1. Seite (WebFragmet) von ViewPager zur 2. Seite geändert (Fragment1) und wieder kam ich zurück zur 1. Seite. Also kein Problem WebFragment ist so wie es ist.

Jetzt wieder habe ich die ViewPager wie folgt geändert WebFragment ->Fragment1 ->Fragment2 und kam zurück zur 1. Seite durch Umkehr der Richtung der oben genannten Aktion. Aber zu dieser Zeit sah ich die WebView in WebFragment wird neu geladen.

Und noch ein Problem, wann immer die WebView gestartet Laden ich kann 2 Protokolleintrag wie sehen.

WebFragment Loading... 
WebFragment Loading... 

Also meine Frage ist:
1) Wie kann ich WebView Nachladen verhindern, wenn die WebFragment von BackStack zurückgehalten wird?
2) Warum hier WebView zweimal laden?

Sehen Sie sich einfach diese Frage an und helfen Sie mir (Prevent WebView reloads in FragmentPagerAdapter?).

Antwort

26

In Ihrer Haupttätigkeit in dem Sie viewpager

nach der Erklärung der viewpager wie diese Linie definiert haben: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

diese Zeilen hinzufügen: von neu

viewpager.setOffscreenPageLimit(2); 

Dies wird verhindern, dass Ihr Fragment Wenn Sie in ViewPager von der 3. Seite zur 1. Seite zurückkehren, wird Ihr Webview nicht neu geladen.

+0

Ziemlich sicher, das ist die richtige Antwort. – Wamasa

+0

@Chirag Shah eigentlich weiß ich das ('viewpager.setOffscopePageLimit (2);') aber wenn ich 5 oder mehr 'Fragmente' in meinem' ViewPager' mit 'WebView' habe, wenn ich' viewpager.setOffscreenseiteLimit (5+); ', Es wird eine schlechte Option sein, richtig? Was du sagst? –

+0

Können Sie für meine zweite Frage antworten? –

2

Gut für Fragmente verwenden Sie so.

A extends Fragment 

{ 

    static WebView w; 

    View v; 

    private Handler handler = new Handler(){ 

    @Override 
    public void handleMessage(Message message) { 

     switch (message.what) { 
      case 1:{ 
       webViewGoBack(); 
      }break; 
     } 
    } 

    private void webViewGoBack() { 
     w.goBack(); 

     // TODO Auto-generated method stub 

    } 
}; 

@Override 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 

v = inflater.inflate(R.layout.webs, container, false); 

w=(WebView)v.findViewById(R.id.webView1); 

//w.loadUrl(""); 

} 

w.setOnKeyListener(new OnKeyListener(){ 

@Override 

public boolean onKey(View v, int keyCode, KeyEvent event) { 

      // TODO Auto-generated method stub 
    if((keyCode==KeyEvent.KEYCODE_BACK)&& w.canGoBack()) 

      { 

       handler.sendEmptyMessage(1); 

       return true; 

      } 
      return false; 
     } 

    }); 
4

Dies ist ein klassischer Fall von Opfern der einfachen Patch-fix der überwiegenden android:configChanges fallen, ein Problem zu lösen. Leider gibt es mehrere Gründe, warum eine Konfigurationsänderung auftritt. So einfach für eine Änderung der Bildschirmgröße zu fangen wird eine Menge von ihnen vermissen ... wie Sie entdeckt haben.

Zuerst vollständig entfernen android:configChanges. Dann füge folgendes zu deinem WebView Fragment hinzu.

protected void onSaveInstanceState(Bundle outState) { 
    webView.saveState(outState); 
} 

Passen Sie Ihre WebView onActivityCreated Methode des Fragments umfassen die folgenden:

public void onActivityCreated(Bundle savedInstanceState) { 
    webView = (WebView) getView().findViewById(R.id.helloWebview); 
    initWebView(); 

    if (savedInstanceState != null) 
     webView.restoreState(savedInstanceState); 
    else 
     webView.loadUrl(currentUrl); 

}

Das bekommen sollten Sie in die richtige Richtung. Beachten Sie, dass beim Aufruf von WebView saveState() keine Anzeigedaten gespeichert werden. ZB geben Eingabekennungen keine Benutzereingabe ein. Sie müssen die Webseite manuell analysieren, um diese Daten zu erhalten. Je nachdem, für was Sie das WebView verwenden, wird dies ein großer Schmerz sein.

Verwandte Themen