Перезагрузка 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
следующим образом WebFragment
→ Fragment1
→ Fragment2
и вернулся на первую страницу, изменив направление действия выше. Но в то время я видел перезагрузку WebView
в WebFragment
.
И еще одна проблема, когда при загрузке WebView
я вижу 2 записи в журнале, например.
WebFragment Loading...
WebFragment Loading...
Итак, мой вопрос:
1) Как предотвратить перезагрузку WebView
, когда WebFragment
сохранен из BackStack
?
2) Почему здесь WebView
загрузка дважды?
Просто просмотрите этот вопрос и помогите мне (Предотвратить перезагрузку WebView в FragmentPagerAdapter?).
Ответы
Ответ 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;
}
});