3

表示されている Web サイトを保持するために、WebView を表示するフラグメントがあります。状態を次のように保存します。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    /*Saves the currently displayed webpage and the browser history*/
    webView.saveState(outState);        
}

次に、次のように復元します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_page_detail,
            container, false);
    webView = (WebView) rootView.findViewById(R.id.page_detail_webview);

    progressBar = (ProgressBar) rootView.findViewById(R.id.op_progress);

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(progress);
            if (progress == 100) {

                progressBar.setVisibility(View.GONE);
            }
        }
    });
    webView.setWebViewClient(new StockStreamWebViewClient());
    webView.getSettings().setBuiltInZoomControls(true);
    /*Restores the saved browser history if there is any*/
    if (savedInstanceState != null) {
        webView.restoreState(savedInstanceState);

    } else if (mItem != null) {
        webView.loadUrl(mItem.content);

    }
    return rootView;
}

ユーザーが WebView に戻ることができるようにするために、アクティビティに次のコードがあります。

@Override
public void onBackPressed() {

    if (!clientFragment.onBackPressed()) {
        super.onBackPressed();
    }
  }
}

そして、私のフラグメントのこのコード:

public boolean onBackPressed() {
    if (webView != null && webView.canGoBack()) {
        webView.goBack();
        return true;
    } else {
        return false;
    }
}

デバイスを回転させると、画面が正しく描画され、WebView は前のページを復元しますが、押し戻すと WebView は null になります。

なぜこうなった?

ありがとう、アンク

4

1 に答える 1

1

#android-dev の SimonVT は、アクティビティから null または新しい Fragment を呼び出している可能性があることを正しく示唆していました。

そこで、フラグメントの ID を保存するために、このコードをアクティビティに追加しました。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (clientFragment != null) {
        outState.putInt(CLIENT_FRAGMENT_ID, clientFragment.getId());
    }
}

そして、正しいフラグメントへの参照を復元するこのコード:

if (savedInstanceState != null
            && savedInstanceState.containsKey(CLIENT_FRAGMENT_ID)) {
        clientFragment = (PageDetailFragment) getSupportFragmentManager()
                .findFragmentById(savedInstanceState.getInt(CLIENT_FRAGMENT_ID));
    }

PageDetailFragment は私の拡張 Fragment です。

ありがとう、アンク

于 2012-09-16T21:01:31.820 に答える