21

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 つすべてFragmentsViewPager( WebFragmentFragment1およびFragment2それぞれ)に入れますFragmentAdapter。そして、私は追加android:configChanges="orientation|screenSize"しましたAndroidManifest.xml(そのWebViewため、構成の変更時にrealodしません)。
今私の問題は、アプリの実行中に最初のページ(WebFragmet)ViewPagerを2番目のページ(Fragment1)に変更し、再び最初のページに戻ったことです。なのでそのままで問題WebFragmentありません。

ここで再び--> -->のViewPagerように変更し、上記のアクションの方向を逆にして最初のページに戻りました。しかし、その時、インがリロードしているのを見ました。WebFragmentFragment1Fragment2WebViewWebFragment

もう 1 つの問題は、読み込みが開始されるたびに、次のWebViewような 2 つのログ エントリが表示されることです。

WebFragment Loading...
WebFragment Loading...

だから私の質問は: 1)が保持されているときにリロード
を防ぐにはどうすればよいですか? 2) なぜここで2 回ロードするのですか?WebViewWebFragmentBackStack
WebView

この質問を見て、助けてください(FragmentPagerAdapterでWebViewのリロードを防ぎますか?)。

4

3 に答える 3

5

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() を呼び出しても、表示データは保存されないことに注意してください。たとえば、入力タグはユーザー入力を保持しません。そのデータを保持するには、Web ページを手動で解析する必要があります。WebView の使用目的によっては、これが大きな問題になります。

于 2013-05-08T17:47:08.147 に答える
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;
        }

     });
于 2013-04-29T08:11:13.763 に答える