Встраивание WebView: быстрый старт

Короткий ответ: вставьте в XML, добавьте разрешение INTERNET в манифест, в Activity/Fragment найдите WebView по id, включите javaScriptEnabled при необходимости, назначьте WebViewClient и загрузите страницу через loadUrl() или loadDataWithBaseURL() — этого достаточно для показа веб‑страниц в приложении.

Быстрая интеграция: 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.