Ответ
Да, работал. WebView позволяет отображать веб-контент внутри приложения. Основные моменты:
- Базовая настройка:
val webView = findViewById<WebView>(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.loadUrl("https://example.com")
- Обработка навигации (чтобы ссылки открывались внутри WebView):
webView.webViewClient = WebViewClient()
- Обработка JS-интерфейсов (взаимодействие между JS и Kotlin/Java):
webView.addJavascriptInterface(MyJsInterface(), "Android")
Важно:
- Проверять
shouldOverrideUrlLoadingдля безопасности. - Очищать кэш и историю в
onDestroy(). - Для сложных сценариев можно использовать Chrome Custom Tabs.
Проблемы:
- Утечки памяти (нужно отделять WebView от Activity).
- Ограничения API (например, на Android 9+
cleartextTrafficтребует явного разрешения).
Ответ 18+ 🔞
А, WebView! Ну это ж классика, ёпта. Как будто на дворе 2002-й год, а мы всё ещё в приложение сайты пихаем. Но работает, чёрт возьми, работает!
Смотри, если по-простому, то это как встроенный браузер, только кривой и вечно чем-то недовольный. Берёшь кусок экрана, суёшь туда WebView, и он тебе сайты показывает. Базовый сценарий — проще пареной репы:
val webView = findViewById<WebView>(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.loadUrl("https://example.com")
Вот и вся магия. Но тут, блядь, подвох сразу: если ты просто так ссылку загрузишь, то при клике на любую другую ссылку пользователя выкинет в системный браузер. А это, я тебе скажу, пользовательский опыт уровня «пизда рулю». Человек думает, что в приложении, а его уже в Chrome вынесло. Волнение ебать!
Чтобы этого не было, надо сказать WebView: «Слушай, дружок, все ссылки обрабатывай сам, не выёбывайся». Для этого нужен WebViewClient.
webView.webViewClient = WebViewClient()
Всё, теперь навигация будет внутри твоего View. Красота.
А теперь самое интересное — взаимодействие с JavaScript. Вот это уже мощь. Представь: у тебя на сайте кнопка, по нажатию которой должно что-то случиться в нативном коде. Например, открыться твой родной экран или отправиться данные. Делается это через JavascriptInterface.
webView.addJavascriptInterface(MyJsInterface(), "Android")
Ты создаёшь класс MyJsInterface, размечаешь методы аннотацией @JavascriptInterface, и они становятся доступны из JS как window.Android.твойМетод(). Прямо мост между мирами, ядрёна вошь!
Но, чувак, слушай сюда, это важно! Безопасность, мать её. WebView — это дыра в твоём приложении размером с чёрную дыру. Особенно эти интерфейсы.
shouldOverrideUrlLoading— твой телохранитель. Всегда проверяй, какую ссылку пытаются открыть. Фильтруй схемы (tel:,mailto:,intent:), смотри домены. Иначе какой-нибудь хитрожопый скрипт уведёт пользователя куда не надо или, того хуже, запустит на телефоне какую-нибудь гадость. Доверия к контенту — ноль ебать.- Уборка за собой. WebView — известный свинюшник в плане памяти. Если его неправильно обработать при уничтожении активити, он будет висеть в памяти и сосать ресурсы, как вампир. В
onDestroy()обязательно отключай его от родителя, останавливай загрузку, чисть кэш и историю. Иначе приложение будет лагать и падать, а пользователи понесут однозвёздочные отзывы. Сам от себя охуеешь, когда начнёшь дебажить утечки. - Тонкий лёд с API. Начиная с Android 9, по умолчанию HTTP-трафик (без SSL) запрещён. Если твой сайт без HTTPS, то WebView просто покажет пустую страницу или ошибку. Надо будет в манифесте танцевать с
android:usesCleartextTraffic="true"или настраивать Network Security Config. А это уже, считай, признание, что твоё приложение — полупидор в плане безопасности.
Если тебе нужен не просто кусок сайта, а полноценная браузерная штука с прогресс-барами, менюшками и прочими плюшками, то лучше посмотреть в сторону Chrome Custom Tabs. Это как WebView, но сделанный профессионалами: быстрый, безопасный, с анимациями и возможностью шаринга. Но это уже отдельная история.
Короче, WebView — инструмент мощный, но с характером. Как старый мотоцикл: заведёшь — поедешь быстро, но если не следить, то в любой момент может накрыться медным тазом и бензина сожрать дохуя.