Вопрос об элементе Select в WebView.

я есть гибридное приложение для Android Cordova, и оно вылетает, когда пользователь нажимает на раскрывающийся список в моемWebView работает на Android OS 8. Я создал простую страницу с<select> тег и проблема воспроизводима. У меня есть обходной путь, который должен сделать мое собственное всплывающее предупреждение, чтобы выбрать, но просто интересно, происходит ли это с кем-то еще, и является ли это OS8WebView ошибка.

Ниже простая страница с<select> тег

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select

Ниже мой аварийный журнал

11:04:58.643 3208-3208/com.****.****E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.****.****, PID: 3208 android.content.res.Resources$NotFoundException: Resource ID #0x0
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:195)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2133)
    at android.content.res.Resources.getLayout(Resources.java:1142)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:416)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
    at org.chromium.content.browser.input.SelectPopupAdapter.getView(SelectPopupAdapter.java:53)
    at android.widget.AbsListView.obtainView(AbsListView.java:2372)
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1408)
    at android.widget.ListView.onMeasure(ListView.java:1315)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1471)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Моя проблема не такая, как эта

При попытке открыть тег SELECT в Android WebView происходит сбой приложения

ОБНОВЛЕНИЕ 9-го января 2018 года: у меня пока нет решения, мой временный обходной путь - удалить тег и просто использовать ввод. Когда пользователь выбирает этот элемент, мы передаем событие в собственный код, чтобы открыть диалоговое окно для выбора и обновляем ввод после того, как пользователь сделал выбор.

ОБНОВЛЕНИЕ 23 марта 2018 года. После еще одного расследования я заметил, что он падает только в том случае, если WebView находится во фрагменте, но не в действии.

Я нашел ниже комментарии от этого поста:

При попытке открыть тег SELECT в Android WebView происходит сбой приложения

«При щелчке по тегу SELECT Android отображает свои параметры с помощью собственного AlertDialog. Веб-представление должно быть создано с контекстом Activity, поскольку экземпляру AlertDialog нужен контекст Activity».

Я считаю, что это ошибка в Android, возможно, неправильно обрабатывает контекст для фрагмента.

ОБНОВЛЕНИЕ 17 апреля 2018 года:

Как указал Кенье, отсюдаhttps://issuetracker.google.com/issues/77246450Google говорит

Вы не должны наследовать объект ресурсов - это никогда не поддерживалось и было возможно только случайно (именно поэтому теперь оно помечено как устаревшее). Фреймворк должен знать обо всех объектах ресурсов, чтобы он мог обновлять их при загрузке веб-просмотра (поскольку веб-просмотр добавляет дополнительные пути к менеджеру ресурсов).

Изменить 29 ноября 2018 года Кажется, эта проблема беспокоила многих людей.

Решение, которое я попробовал и протестировал для работы, состоит в том, чтобы не создавать подклассы ресурса.Обновление компиляции SDK и поддерживаемой версии библиотеки работало для некоторых людей.Добавление класса-обертки в Resource может сработать, я попробовал этот подход во время моего первоначального исследования, он решил проблему сбоев Select, все еще падает, когда вы нажимаете и удерживаете текстовое представление, чтобы открыть опции «COPY», «PASTE» ,
 CommonsWare14 сент. 2017 г., 01:17
Я не могу воспроизвести это на Google Pixel под управлением Android 8.0.0. При нажатии на раскрывающееся окно появляется диалоговое окно, как и ожидалось. мойWebView конфигурация минимальная, простоsetJavaScriptEnabled(true), FWIW, эта проблемаПохоже, было сообщено ранее в этом году для Android 7.0, но никто не предоставил воспроизводимый контрольный пример, поэтому проблема никуда не делась.
 Nivedh17 нояб. 2017 г., 06:00
Могу ли я узнать, как вы решаете эту проблему? Я также получаю ту же проблему в моем приложении в Google Pixel. Но он отлично работает в пиксельном браузере, а также в другом фиктивном приложении, которое я создал.
 Tomin B Azhakathu12 янв. 2018 г., 12:55
Привет @ Денис Хуэй. Это oage хорошо работает в браузере телефонов?
 Swapnil Sonar16 янв. 2018 г., 10:15
Мы сталкиваемся с той же проблемой. Есть какие-нибудь обновления по этому поводу?
 Vladimir Kosinets24 окт. 2017 г., 18:10
Есть новости по этому поводу?

Ответы на вопрос(8)

вы устанавливаете целочисленное значение для Textview. попробуйте использоватьString.valueOf(value) установить значение в Textview.

 Raanan16 янв. 2018 г., 13:57
Вопрос об элементе Select в WebView.

я обнаружил, что это был даже не мой код, который подклассифицировал класс Resources, а скорее версию библиотеки поддержки Google, которую я использовал. Обновлена ​​версия библиотеки поддержки, и она заработала!

что позволило нам продолжить подклассыResources и не ломать наши WebViews. Предупреждение: мы не можем позволить нашему WebView видеть или взаимодействовать с подклассом наших ресурсов И мы должны создавать WebView программно. Первым шагом является предоставление метода в подклассе Resources для извлечения исходных ресурсов.

Допустим, наш подкласс ресурсов называетсяCustomResourcesWrapper и нашContextWrapper подкласс называетсяCustomContextWrapper.

Сначала мы обновляемCustomResourcesWrapper так что мы можем получить доступ к оригиналуResources объект

public class CustomResourcesWrapper {

    public static Resources findOriginalResources(Context context) {
        if (context.getResources() instanceof CustomResourcesWrapper) {
            return ((CustomResourcesWrapper) context.getResources()).getOriginalResources();
        }
        if (context instanceof ContextWrapper) {
            return findOriginalResources(((ContextWrapper) context).getBaseContext());
        }
        return context.getResources();
    }

    private Resources getOriginalResources() {
        return originalResources;
    }
}

Мы также предполагаемCustomContextWrapper выглядит примерно так ...

public class CustomContextWrapper extends ContextWrapper {

    private final Resources wrappedResources;

    public CustomContextWrapper(Context base, Resources resources) {
        super(base);
        this.wrappedResources = resources;
    }

    @Override
    public Resources getResources() {
        return wrappedResources;
    }
}

Затем мы создаем статический вспомогательный метод, чтобы «развернуть» наши пользовательские ресурсы и скрыть их

// the method name is a bit of a misnomer, 
// we're actually unwrapping, then re-wrapping
public static Context unwrapCustomContext(Context wrapped) {
    Resources originalResources = CustomResourcesWrapper.findOriginalResources(wrapped);
    Context customUnwrappedContext = new CustomContextWrapper(wrapped, originalResources);
    return new ContextThemeWrapper(customUnwrappedContext, android.support.v7.appcompat.R.style.Theme_AppCompat_Light);
}

Когда приходит время создавать WebView, убедитесь, чтоContext мы переходим к нему проходит через вышеупомянутый метод, т.е.WebView webView = new WebView(unwrapCustomContext(context)), Я не уверен на 100%, почему, ноContextThemeWrapper является обязательной частью этого взлома.

 Dennis Hui28 нояб. 2018 г., 22:18
Я думаю, что попробовал этот подход, и он работал для тега SELECT, но он все еще падал, когда вы щелкали и удерживали текстовое представление, чтобы открыть параметры COPY PASTE.
 Geoff29 нояб. 2018 г., 20:46
хм, не кажется проблемой в нашей реализации (только что сделал быстрый тест и смог скопировать текст просто отлично)

вы можете получить некоторые полезные идеи

Webiview используетэтот файл макетаselect_dialog_singlechoice.xml для надувания предмета SpinnerArrayAdaperВы получаете Ресурс не найден ИсключениеотсюдаЭто означает, что Ваше Webview не может найти этот файл ресурсов, когда вы нажимаете на тег выбора

Я не уверен, почему это происходит на Android 8.0, но я не смог воспроизвести это на эмуляторе Android 8.0, хотя

те обновить ваш compileSdkVersion до 26, а ваш com.android.support:appcompat-v7 - до 26.

 Raanan08 янв. 2018 г., 17:37
Не решает проблему.
 Billa22 дек. 2017 г., 05:00
Не добавляйте комментарии здесь.
 Dennis Hui23 мар. 2018 г., 04:16
Обновление compileSdkVersion у меня не сработало.
 Fabian Köbel03 апр. 2018 г., 15:15
Обновление compileSdkVersion и всех версий вспомогательной библиотеки решило проблему для меня.
Решение Вопроса

https://issuetracker.google.com/issues/77246450

Не делите ресурсы на подклассы ... не будет исправлено, по-видимому.

 Dennis Hui11 апр. 2018 г., 01:39
Я думаю, что это именно проблема, спасибо.

Fragment только на OS8. Мой обходной путь - использовать Activity вместо Fragment для этого конкретного потока. Мне кажется дефект Android во Фрагменте.

 CommonsWare23 мар. 2018 г., 14:21
Вот пример приложения показывая чтоWebView прекрасно работает вFragment при отображении веб-страницы по URL из вашего вопроса. Протестировано на Android 8.1 (Nexus 5X).
 CommonsWare27 мар. 2018 г., 12:43
Тогда, возможно, не переопределитьgetResource(), Я считаю, что это довольно значительный запах кода сам по себе.
 Dennis Hui27 мар. 2018 г., 10:59
@CommonsWare Спасибо за пример приложения. Вы правы, фрагмент с WebView не был причиной сбоя. Оказалось, это вызвано переопределением функции getRecource () в Activity. Я немного изменил ваш проект и заставил его рухнуть. ЗагруженоВот

ContextWrapper в вашейActivity класс. В моем случае я переопределяюattachBaseContext метод. Проверьте этот метод и используйтеsuper.attachBaseContext(newBase).

Ваш ответ на вопрос