21

बनाए रखा है यहाँ एक बुनियादी Fragment जो एक WebView शामिल करने के लिए एक कोड है।
WebFragment.java
WebView पुन: लोड जब ViewPager में टुकड़ा प्रपत्र 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) { 
    } 
} 
} 

2 अधिक बुनियादी टुकड़े भी (जो WebView नहीं है) है। तब मैं डाल इन 3 FragmentsViewPager में (WebFragment, Fragment1 और Fragment2 क्रमशः) FragmentAdapter का उपयोग करके सभी। और मैं AndroidManifest.xml में android:configChanges="orientation|screenSize" जोड़ा (तो WebView configration परिवर्तन पर realod नहीं होगा)।
अब मेरी समस्या यह है कि, ऐप चलाने के दौरान मैंने ViewPager के पहले पृष्ठ (Fragment1) के पहले पृष्ठ (WebFragmet) को बदल दिया और फिर मैं 1 पृष्ठ पर वापस आया। तो WebFragment कोई समस्या नहीं है।

अब फिर मैंने ViewPager को WebFragment ->Fragment1 ->Fragment2 और ऊपर की कार्रवाई की दिशा को उलटकर 1 पृष्ठ पर वापस आ गया। लेकिन उस समय मैंने WebViewWebFragment में पुनः लोड किया है।

और एक और समस्या है, जब भी WebView लोड हो रहा है शुरू कर दिया मैं की तरह 2 लॉग प्रविष्टि देख सकते हैं।

WebFragment Loading... 
WebFragment Loading... 

तो मेरे सवाल है:
1) मैं WebView reloading कैसे रोका जा सकता है जब WebFragmentBackStack से बनाए रखा है?
2) यहाँ क्यों WebView लोड हो रहा है दो बार?

बस यह प्रश्न देखें और मेरी मदद करें (Prevent WebView reloads in FragmentPagerAdapter?)।

उत्तर

26

अपने मुख्य गतिविधि में जहाँ आप इस लाइन की तरह viewpager की घोषणा के बाद viewpager

परिभाषित किया है:

viewpager.setOffscreenPageLimit(2); 

यह निर्मित से अपने टुकड़ा नहीं कर पाएगा: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

इस लाइन को जोड़ने दो स्क्रीनों के स्वाइप तक, इसलिए जब आप व्यूपर में तीसरे पृष्ठ से 1 पृष्ठ पर वापस आ जाएंगे, तो आपका वेबव्यू पुनः लोड नहीं होगा।

+0

बहुत यकीन है कि यह सही जवाब है। – Wamasa

+0

@ धीराग शाह वास्तव में मुझे यह पता है ('viewpager.setOffscreenPageLimit (2);') लेकिन यदि मेरे पास 'WebPiew' के साथ मेरे' ViewPager' में 5 या अधिक 'Fragments' हैं, तो यदि मैं 'viewpager.setOffscreenPageLimit (5+) सेट करता हूं; ', यह एक बुरा विकल्प होगा, कठोर? क्या आप कहते हैं? –

+0

क्या आप मेरे दूसरे प्रश्न के उत्तर दे सकते हैं? –

2

टुकड़े इस तरह का उपयोग अच्छी तरह से करने के लिए।

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

इस अधिभावी android:configChanges की आसान पैच ठीक करने के लिए शिकार गिर रही एक समस्या को हल करने का एक उत्कृष्ट उदाहरण है। दुर्भाग्यवश कई कारण हैं कि एक कॉन्फ़िगरेशन परिवर्तन क्यों होगा। तो बस एक स्क्रीन आकार परिवर्तन के लिए पकड़ने से उनमें से बहुत से याद आती है ... जैसा कि आपने पाया है।

सबसे पहले, पूरी तरह से android:configChanges हटा दें। फिर अपने WebView खंड में निम्नलिखित जोड़ें।

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

निम्नलिखित शामिल करने के लिए अपने WebView टुकड़ा के onActivityCreated विधि समायोजित करें:

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

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

}

आप सही दिशा में जा मिलता है चाहिए। नोट, WebView की saveState() को कॉल करने से प्रदर्शन डेटा सहेज नहीं जाएगा। उदाहरण के लिए, इनपुट टैग उपयोगकर्ता इनपुट को सुरक्षित नहीं रखेंगे। उस डेटा को बनाए रखने के लिए आपको मैन्युअल रूप से वेबपृष्ठ के माध्यम से पार्स करना होगा। वेबव्यू के लिए आप जो भी उपयोग कर रहे हैं उसके आधार पर, यह एक बड़ा दर्द होगा।

संबंधित मुद्दे