Встраивание WebView: быстрый старт
Короткий ответ: вставьте
Быстрая интеграция: XML и разрешения
Добавьте WebView в layout (полноэкранно или внутри контейнера):
<!-- res/layout/activity_main.xml -->
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
В AndroidManifest.xml укажите минимум разрешение доступа в сеть:
<uses-permission android:name="android.permission.INTERNET" />
Если показываете внешний сайт, убедитесь, что в манифесте включено аппаратное ускорение (обычно по умолчанию): android:hardwareAccelerated="true".
Настройка и навигация (Activity / Fragment)
Инициализация и основные настройки в Kotlin:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val webView: WebView = findViewById(R.id.webView)
webView.settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
loadWithOverviewMode = true
useWideViewPort = true
builtInZoomControls = true
displayZoomControls = false
}
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?) : Boolean {
view?.loadUrl(request?.url.toString())
return true
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { /* показать ProgressBar */ }
override fun onPageFinished(view: WebView?, url: String?) { /* скрыть ProgressBar */ }
}
webView.loadUrl("https://example.com")
}
override fun onBackPressed() {
val webView: WebView = findViewById(R.id.webView)
if (webView.canGoBack()) webView.goBack() else super.onBackPressed()
}
}
Для взаимодействия с JavaScript используйте addJavascriptInterface:
webView.addJavascriptInterface(WebAppInterface(this), "Android")
Внутри класса WebAppInterface пометьте методы @JavascriptInterface.
Включайте javaScriptEnabled только если нужно — это увеличивает риск XSS/инъекций. Никогда не добавляйте ненадёжные объекты через addJavascriptInterface для сторонних страниц.
Оптимизация, безопасность и отладка
Рекомендации для стабильной работы и безопасности:
- Очищайте память: при уничтожении Activity вызывайте webView.apply { clearHistory(); clearCache(true); removeAllViews(); destroy() }.
- Ограничьте доступ к локальным файлам: webView.settings.allowFileAccess = false (особенно на Android 7+).
- Управление смешанным контентом: webView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE для HTTPS.
- Кеширование: включите setAppCacheEnabled(true) и настройте cacheMode для оффлайн‑режима при необходимости.
- Аппаратное ускорение помогает с рендером, но для проблем с отрисовкой можно временно переключить layerType.
Отладка: подключите устройство и в Chrome откройте chrome://inspect, выберите WebView — можно инспектировать DOM, консоль и сеть.
Добавьте ProgressBar поверх WebView и обновляйте видимость в onPageStarted/onPageFinished — это улучшит UX при медленном соединении.
Частые ошибки
- Белый экран — нет разрешения INTERNET или URL блокируется (проверьте доступность и https).
- JavaScript не работает — забыли включить javaScriptEnabled.
- Ссылки открываются в браузере — не назначен WebViewClient или неправильно реализован shouldOverrideUrlLoading.
- Утечки памяти — не вызывается webView.destroy() в onDestroy().
- File:// открываются в WebView — отключите allowFileAccess, если не требуется.
FAQ
- Нужно ли указывать User-Agent? Иногда — для корректной верстки мобильной версии. webView.settings.userAgentString = "YourAgent".
- Как загрузить локальную страницу? Поместите в assets и вызовите webView.loadUrl("file:///android_asset/index.html") или webView.loadDataWithBaseURL(...).
- Как заблокировать переход на внешний домен? Перехватите в shouldOverrideUrlLoading и проверяйте host перед загрузкой.
С этими шагами вы быстро добавите WebView, настроите навигацию и минимизируете риски. Тестируйте на реальных устройствах и проверяйте поведение при разных версиях Android System WebView.