2013-06-07 12 views
6

WebViewコンテンツのスクロール位置に関する問題が発生しています。ここには次のような問題があります。ページをある程度縦方向にスクロールしていて、スクロールが上下に動きます。それはポートレートモードにある正確な内容を示していません。私はconfigChanges="keyboardHidden|orientation|screenSize"としてManifestファイルの変更を試みましたが、運はありません。私はをオーバーライドしましたが、それはうまくいきませんでした。私はこのquestionで受け入れられた答えを実装しましたが、使用していません。誰かが何をしなければならないのか、なぜそれはうまくいかないのでしょうか?これはGoogle Nexusタブ用で、必要な最小SDKバージョンは14です。 ありがとうございます。WebViewの位置を向きの変更で同じコンテンツに戻す

答えて

1

ビュークラスには、Parcelableを返すonSaveInstanceState()メソッドと、onRestoreInstanceState(Parcelable state)メソッドを返して状態を復元するメソッドがあります。正しくリコールすると、保存された状態にはスクロール位置が含まれます。あなたがする必要があるすべてはあなたのフラグメントのonSaveInstanceState方法でのWebViewのonSaveInstanceState()への呼び出しから取得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); 
     } 
    } 

    .... 

} 
+0

Tom Tascheの答えのコメントをご覧ください。 – Lavanya

+0

フラグメントを使用していない場合はnoですが、これは機能しません。これが十分な大きさの問題であれば、フラグメントベースのバージョンを試してみる価値があるかもしれません(とにかくアクティビティ内のフラグメントに移動する必要があり、サポートライブラリは下位互換性を提供します)。 – Phil

+0

私はこれを試しましたが、 'savedState.putParcelable(" myKey "、webView.onSaveInstanceState());行は、' onSaveInstanceState()がandroid.view.Viewのアクセスを保護しています 'というエラーを返します。 – primehalo

0

onSaveInstanceStateを使用して、のスクロールビューの復元をonRestoreInstanceStateメソッドで保存するようにしてください。 はいが、その後は、そのビューを参照を取得し、活動が保存されてstate.Hopeにscrollviewのその後、セット位置を復元するときに、この場合に役立ちますuは?xmlの THR Scrollviewを使用しました。

+0

私のコメントを見てくださいTomTascheの回答 – Lavanya

2

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

私は今、次のアプローチを使用しています:、のonCreateでoutState.putInt(EXTRA_SCROLL_POSITION, webView.getScrollY());

  • savedInstanceStateから最後のスクロール位置を取得して設定:onSaveInstanceStateで

    1. は、WebViewのの現在のスクロール位置を保存しますカスタム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; 
           } 
          } 
      }); 
      

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

  • +0

    私の活動は方向を変えてもそれは再現されません。onSaveInstanceStateを使用するにはどうしたらいいですか?onSaveInstanceStateは、別のアプリケーションにフォーカスを失ったときにのみ呼び出されます。私のアクティビティは再作成されないので、onRestoreInstanceStateも使用できません。 @TomTasche – Lavanya

    +0

    ああ、そうだ。あなたはonRestoreInstanceStateの代わりに 'onConfigurationChanged'を使うことができますが、私はあなたがonSaveInstanceStateを何に置き換えることができるか分かりません。ごめんなさい! – TomTasche

    関連する問題