Intereting Posts
Android и MJPEG Как я могу получить значение счетчика webkit-column-count и текущую страницу или идентификатор столбца? Приложение Android в Eclipse: отредактируйте текст, не отображающийся на графическом макете Eclipse сохраняет рабочее пространство … и строительное пространство … и рабочее пространство для строительства Переполнение ReferenceTable (max = 512) JNI Как предотвратить открытие ссылок в интегрированном мини-браузере Gmail App Widget не отображается в списке виджетов на устройствах Honeycomb до тех пор, пока Launcher не будет перезапущен Типовое предупреждение о безопасности с помощью итератора JSON В чем разница между отсоединением фрагмента и его удалением? OverridePendingTransition для плавной активности в режиме ожидания Как исправить «Call требует API уровня 11» с Android Activity? Ошибка. Редактирование инструментов сборки SDK (23.0.3) слишком мало для проекта «Приложение». Минимальное значение – 25.0.0 Использование фрагмента Android без использования UI Создание сложных элементов управления с помощью пользовательских атрибутов XML Очистка статических данных onDestroy ()

Перезагрузка 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 (поэтому WebView не будет использоваться при изменении конфигурации).
Теперь моя проблема: при запуске приложения я изменил 1-ю страницу (WebFragmet) ViewPager на 2-ю страницу ( Fragment1 ), и снова я вернулся на ViewPager страницу. Таким образом, нет проблем с WebFragment .

Теперь снова я изменил ViewPager как этот WebFragment -> Fragment1 -> Fragment2 и вернулся на первую страницу, изменив направление действия выше. Но в то время я видел, как WebView в WebFragment перезагружается.

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

 WebFragment Loading... WebFragment Loading... 

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

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

Solutions Collecting From Web of "Перезагрузка WebView, когда Fragment в ViewPager сохраняется в форме BackStack"

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

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

Добавьте эту строку:

 viewpager.setOffscreenPageLimit(2); 

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

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

Во-первых, полностью удалите android:configChanges . Затем добавьте следующее в ваш фрагмент WebView .

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

onActivityCreated метод onActivityCreated для фрагмента onActivityCreated чтобы включить следующее:

 public void onActivityCreated(Bundle savedInstanceState) { webView = (WebView) getView().findViewById(R.id.helloWebview); initWebView(); if (savedInstanceState != null) webView.restoreState(savedInstanceState); else webView.loadUrl(currentUrl); 

}

Это должно заставить вас идти в правильном направлении. Обратите внимание, что вызов SaveState () WebView не будет сохранять отображаемые данные. Например, теги ввода не будут вызывать пользовательский ввод. Вам нужно будет вручную проанализировать веб-страницу, чтобы сохранить эти данные. В зависимости от того, что вы используете в WebView, это будет серьезной болью.

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

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