Все началось с простого WebView в приложении для Android.
Это представление загружает информацию с общедоступного URL. Ничего необычного там нет.
Однако ... если должно произойти прерывание сети, вы легко можете получить ошибку, отображаемую на видном месте в WebView .
Ну, это не хорошо, верно? Поэтому я искал документы и другие места, чтобы найти способ подавить это или поймать в ловушку ... и не нашел никаких следов. После этого я запросил #android-dev
на IRC: я знаю о WebView.onReceivedError , но можно ли подавить визуальную часть? (Вместо этого я хотел отобразить Dialog предупреждение об указанной сетевой проблеме с возможностью повторить попытку.)
Ответ: Вы не можете . (
Очень хорошо. Время для плана B. Возможно, ImageView может заполнить счет?
В случае какой-либо ошибки WebView , ImageView может использоваться в качестве временного занавеса. Он накрывает WebView в начале (до загрузки URL), затем исчезает, показывая WebView позади него. Если WebView работает, замечательно! Но если включается onReceivedError , мы немедленно поднимаем шторку и показываем вышеупомянутый диалог. Как только WebView получает onPageFinished , шторка снова исчезает.
... и ЭТО ... работает ЧУДЕСНО!
Пока меня не попросили поддержать изменения ориентации экрана. (Предвещает: «Отсюда все пошло вниз».)
До сих пор приложение использовало android:screenOrientation="portrait"
в основной деятельности Manifest. Поэтому я удалил эту часть, и, конечно же, мы столкнулись с печально известной проблемой «активность перезапускается», которая сдувается, а затем возвращает WebView .
Конечно, это не проблема сама по себе. Это Android OS, работающая как задумано.
Кроме того, мы хотим, чтобы ImageView отображался правильно в зависимости от ориентации. К счастью, у нас есть альтернативных ресурсов , которые мы можем использовать! Между тем, у нас все еще есть WebView , который мы не хотим перезагружать. Мы хотим, чтобы он был оставлен в покое и позволил представлению делать свое дело, будь то портрет или пейзаж.
Я нашел несколько хорошо объясненных способов справиться с ориентацией экрана , плюс уже прочитал автора Марк Мерфи Электронные книги (Настоятельно рекомендуется к прочтению). И все же я застрял! С ImageView теперь в миксе, ни один из методов, кажется, не заполняет счет:
Принудительный портретный режим, конечно,
не может быть и речи (или это так?).
android:configChanges="keyboardHidden|orientation"
и onConfigurationChanged
кажется
позаботиться о WebView, который
блаженно обрабатывает экран
изменение размера изящно само по себе. из
конечно, ImageView не получает
памятка либо, и он продолжает использовать
его оригинальный (портрет / пейзаж) ресурс!
Непродуманный призыв к
activity.setRequestedOrientation(newConfig.orientation)
в обработчике изменения конфигурации
не помогло.
Поскольку WebView не нужно
сохраняется между выполнением приложения,
onRetainNonConfigurationInstance
выглядело как еще одна возможность.
Увы, это не сработало
или. Сброс webview
с помощью
последний неконфиг
это все, что я действительно прошел)
в результате пустое WebView . Не
именно то, что я был после.
с другой
рука, ImageView , казалось,
приятно реагировать на ориентацию
изменения. Иди цифрой.
Как насчет onSaveInstanceState
? Так же
подводные камни. WebView имеет saveState
метод, но это, кажется, не
сохранить его на достаточно глубоком уровне, чтобы
сохранить переход без проблем. Если так,
тогда это, вероятно, не должно
либо, так что это может быть неправильно
путь тоже.
Что касается мудрости использования configChanges
, , документация рекомендует именно эту технику , фактически:
Стандартное поведение для Задания быть уничтоженным и воссозданным, когда
ориентация устройства изменена. это
заставит WebView перезагрузить
текущая страница. Если ты не хочешь этого,
вы можете настроить Activity для обработки
orientation
и keyboardHidden
изменения, а затем просто оставить
WebView в одиночку. Это будет автоматически
переориентируйте себя соответствующим образом.
Конечно Я мог бы также совершить здесь какую-то ошибку пилота , но мне еще предстоит выяснить, что это может быть.
Я прочитал и перечитал документацию и попробовал все возможные способы, чтобы взломать это самостоятельно. Возможно, я что-то упускаю (очевидное?) В документации, или решение неочевидно (но кто-то может пролить свет) ... или это просто невозможно. Надеюсь, что не последний.
Подсказки приветствуются / приветствуются!