8

コンテンツのスクロール位置に関する問題に直面してWebViewいます。これは次のとおりです。縦向きモードでページをある程度下にスクロールしています。向きを横向きに変更すると、スクロールが上下に移動します。ポートレートモードにある正確なコンテンツは表示されません。マニフェストファイルを変更しようとしましconfigChanges="keyboardHidden|orientation|screenSize"たが、うまくいきませんでした。オーバーライドしonConfigurationChanged()ましたが、うまくいきませんでした。この質問で受け入れられた回答を実装しましたが、役に立ちません。誰かが何をしなければならないか、なぜそれがうまくいかないのかを提案できますか? これは Google Nexus Tab 用で、必要な最小 SDK バージョンは 14 です。ありがとうございます。

4

3 に答える 3

5

アプリで同じ問題に直面したことを覚えています。私が間違っていなければ、Phil が提案した解決策は機能しません (Android の一部のバージョンでは?)。

現在、次のアプローチを使用しています。

  1. onSaveInstanceState で、WebView の現在のスクロール位置を保存します。outState.putInt(EXTRA_SCROLL_POSITION, webView.getScrollY());
  2. onCreate で、savedInstanceState から最後のスクロール位置を取得し、カスタム WebViewClient を設定します。

    setWebViewClient(new WebViewClient() {
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
    
            if (!scrolled) {
                postDelayed(new Runnable() {
    
                    @Override
                    public void run() {
                        scrollBy(0, scroll);
                    }
                }, 250);
    
                scrolled = true;
            }
        }
    });
    

これは地獄のように醜いですが、私にとってはちょっとうまくいきます(これは現在のズームレベルなどを考慮していません)。そのコードについて改善できることはたくさんありますが、基本的にはうまくいきます。

于 2013-06-15T20:50:21.833 に答える
2

ビュー クラスには、onSaveInstanceState()を返すメソッドと、状態を復元Parcelableするメソッドがあります。onRestoreInstanceState(Parcelable state)正しく思い出せば、保存された状態にはスクロール位置が含まれます。必要なのonSaveInstanceState()は、フラグメントのonSaveInstanceStateメソッドで WebView の呼び出しから取得した Parcelable を保存することだけです。

public void onSaveInstanceState(Bundle savedState) {

    super.onSaveInstanceState(savedState);

    WebView webView = (WebView) findViewById( ... );
    savedState.putParcelable("myKey", webView.onSaveInstanceState());

}

次に、onCreateViewメソッドで、可能な場合はその状態を復元します。

public View onCreateView (LayoutInflater inflater, 
    ViewGroup container, Bundle savedInstanceState) {

    ...

    if (savedInstanceState != null) {
        WebView webView = (WebView) findViewById( ... );
        Parcelable savedState = savedInstanceState.getParcelable("myKey");
        if (savedState != null) {
           webView.onRestoreInstanceState(savedState);
        }
    }

    ....

}
于 2013-06-13T14:44:05.000 に答える
0

onSaveInstanceStateを利用してスクロールビューの状態を保存し、onRestoreInstanceState メソッドで復元してみてください。Scrollview thr xml を使用しましたか?はいの場合は、そのビューへの参照を取得し、アクティビティの復元時にスクロールビューの位置を保存された状態に設定します。これが役立つことを願っています。

于 2013-06-15T11:30:54.087 に答える