Подтвердить что ты не робот

Перезагрузка WebView, когда Fragment в ViewPager сохраняется в форме BackStack

Вот код базового Fragment, который содержит WebView.
WebFragment.java

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 Fragments в ViewPager (WebFragment, Fragment1 и Fragment2 соответственно), используя FragmentAdapter. И я добавил android:configChanges="orientation|screenSize" в AndroidManifest.xml (So WebView не будет использоваться при изменении конфигурации).
Теперь моя проблема: во время запуска приложения я изменил первую страницу (WebFragmet) на ViewPager на 2-ю страницу (Fragment1), и снова я вернулся на первую страницу. Таким образом, проблема WebFragment такова, как есть.

Теперь снова я изменил ViewPager следующим образом WebFragmentFragment1Fragment2 и вернулся на первую страницу, изменив направление действия выше. Но в то время я видел перезагрузку WebView в WebFragment.

И еще одна проблема, когда при загрузке WebView я вижу 2 записи в журнале, например.

WebFragment Loading...
WebFragment Loading...

Итак, мой вопрос:
1) Как предотвратить перезагрузку WebView, когда WebFragment сохранен из BackStack?
2) Почему здесь WebView загрузка дважды?

Просто просмотрите этот вопрос и помогите мне (Предотвратить перезагрузку WebView в FragmentPagerAdapter?).

4b9b3361

Ответ 1

В вашем основном действии, где вы определили viewpager

после объявления viewpager как эта строка: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

добавить эту строку:

viewpager.setOffscreenPageLimit(2);

Это предотвратит воссоздание фрагмента до двух экранов, поэтому, когда вы вернетесь с третьей страницы на первую страницу в viewpager, ваш веб-просмотр не будет перезагружен.

Ответ 2

Это классический случай падения жертвы легкого исправления исправления переопределения android:configChanges для решения проблемы. К сожалению, есть несколько причин, по которым произойдет изменение конфигурации. Так что просто ловить для изменения размера экрана будет не хватать многих из них... как вы обнаружили.

Сначала полностью удалите android:configChanges. Затем добавьте следующее к фрагменту WebView.

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

Откорректируйте метод 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() не будет сохранять отображаемые данные. Например, теги ввода не будут вызывать пользовательский ввод. Вам нужно будет вручную проанализировать веб-страницу, чтобы сохранить эти данные. В зависимости от того, для чего вы используете WebView, это будет большой болью.

Ответ 3

Ну для фрагментов используйте вот так.

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;
        }

     });