すべては、Android アプリ内のシンプルなWebViewから始まりました。
このビューは、公開 URL から情報を読み込みます。そこには何も珍しいことはありません。
ただし...ネットワークの中断が発生した場合、エラーがWebViewに目立つように表示されてしまう可能性があります。
あれ、もったいないですよね?そこで、これを抑制する方法やトラップする方法をドキュメントや他の場所で検索しましたが、手がかりが見つかりませんでした。#android-dev
そこで、IRCに問い合わせてみました: WebView.onReceivedErrorについては知っていますが、視覚的な部分を抑制できますか? (代わりに、ネットワークの問題に関するダイアログ警告を表示し、再試行するオプションを付けたかったのです。)
回答:できません。:(
結構。プラン B の時間です。おそらく、ImageViewで十分ではないでしょうか?
何らかのWebViewエラーが発生した場合は、ImageViewをその場しのぎのカーテンとして使用できます。最初 (URL が読み込まれる前) にWebViewをオーバーレイし、その後フェードしてその背後にあるWebViewを表示します。WebViewが機能する場合は、すばらしいことです。しかし、onReceivedErrorが発生した場合は、カーテンをすぐに元に戻し、前述のダイアログを表示します。WebView がonPageFinishedを取得すると、カーテンが再びフェードします。
...そしてこれは...素晴らしく機能します!
画面の向きの変更をサポートするように頼まれるまで。(予言: 「物事はここから下り坂になった。」)
これまで、アプリはandroid:screenOrientation="portrait"
マニフェストのメイン アクティビティで使用されていました。そのため、その部分を削除しました。もちろん、悪名高い「アクティビティが再起動されています」という問題に遭遇しました。
もちろん、それ自体は問題ではありません。これは、設計どおりに動作する Android OS です。
また、方向に応じてImageViewが適切に表示されるようにします。ありがたいことに、活用できる代替リソースがあります。その間、リロードしたくないこのWebViewがまだあります。私たちはそれを放っておいて、その時点で縦向きであろうと横向きであろうと、ビューが独自のことをするようにしたいと考えています.
画面の向きを処理するための十分に説明された方法をいくつか見つけました。さらに、著者のMark Murphy の 電子ブックを既に読んでいます(読むことを強くお勧めします)。それでも私は立ち往生していました!ImageViewが混在するようになったので、どのテクニックも請求書を満たしていないようです。
もちろん、ポートレート モードを強制することは問題外です (またはそうでしょうか?)。
android:configChanges="keyboardHidden|orientation"
またonConfigurationChanged
、画面のサイズ変更を独自に適切に処理する WebView を処理しているようです。もちろん、ImageViewもメモを取得せず、元の (ポートレート/ランドスケープ) リソースを使用し続けます!構成変更ハンドラー内での不適切な呼び出し
activity.setRequestedOrientation(newConfig.orientation)
は問題を解決しませんでした。アプリの実行間でWebViewを永続化する必要がないため、別の可能性のように 見え
onRetainNonConfigurationInstance
ました。残念ながら、それもうまくいかなかったようです。最後の非構成インスタンスでリセットwebview
すると(実際に渡したのはそれだけなので)、空白のWebViewが発生しました。私が求めていたものとはまったく異なります。一方、ImageViewは向きの変化にうまく反応しているように見えました。図に行きます。
どう
onSaveInstanceState
ですか?同じ落とし穴。WebViewにはsaveState
メソッドがありますが、遷移をシームレスに保つのに十分な深さで保存していないようです。もしそうなら、おそらくそれも想定されていないので、これも間違った方法かもしれません。
を使用する知恵についてconfigChanges
は、ドキュメントではこの手法を推奨しています。実際には次のとおりです。
アクティビティの標準的な動作は、デバイスの向きが変更されたときに破棄され、再作成されることです。これにより、WebViewが現在のページをリロードします。それが望ましくない場合は、アクティビティ
orientation
を設定して変更を処理し、 WebViewkeyboardHidden
をそのままにしておく ことができます。必要に応じて自動的に向きを変えます。
もちろん、ここで何らかのパイロットエラーを犯している可能性もありますが、それが何であるかはまだわかりません.
私はドキュメントを読んで再読し、自分でこれをハックするあらゆる方法を試しました。おそらく、私はドキュメントに何か(明白な?)が欠けているか、解決策が明白ではない(しかし誰かが光を当てることができる)...またはこれは単に不可能です。後者ではないことを願っています。
手がかりは歓迎/感謝します!