• Главная
  • Карта сайта
Не найдено

Android: WebView - створи свій браузер

Стаття проплачена кішками - всесвітньо відомими виробниками кошенят.

Якщо стаття вам сподобалася, то можете підтримати проект .

Android дозволяє створити власне вікно для перегляду веб-сторінок або навіть створити свій клон браузера за допомогою елемента WebView. Сам елемент використовує движок WebKit і має безліч властивостей і методів. Ми обмежимося базовим прикладом створення додатка, за допомогою якого зможемо переглядати сторінки в інтернеті. В останніх версіях використовується движок від Chromium, але великої різниці в цьому немає для простих завдань.

Створимо новий проект MyBrowser і відразу замінимо код у файлі розмітки res / layout / activity_main.xml:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <WebView android: id = "@ + id / webView" xmlns: android = "http://schemas.android.com/apk/res/android "android: layout_width =" match_parent "android: layout_height =" match_parent "/>

Тепер відкриємо файл активності MainActivity.java і оголосимо компонент WebView, а також инициализируем його - включимо підтримку JavaScript і вкажемо сторінку для завантаження.

private WebView webView; public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); webView = findViewById (R.id.webView); // включаємо підтримку JavaScript webView.getSettings (). SetJavaScriptEnabled (true); // вказуємо сторінку завантаження webView.loadUrl ( "http://developer.alexanderklimov.ru/android"); }

Так як додаток буде використовувати інтернет, необхідно встановити дозвіл на доступ до інтернету в файлі-маніфесті.

<Uses-permission android: name = "android.permission.INTERNET" />

Там же в маніфесті модифікуємо рядок для екрану, видаливши заголовок з нашого застосування (виділено жирним):

<activity android: name = ". HelloWebViewActivity" android: label = "@ string / app_name" android: theme = "@ style / Theme.AppCompat.NoActionBar">

Запустимо програму. У нашому розпорядженні з'явився найпростіший вьювер веб-сторінок, але з одним недоліком. Якщо ви клацнете на будь-якому посиланню, то у вас автоматично запуститься браузер за замовчуванням і нова сторінка відобразиться вже там. Точніше так було раніше. На нових пристроях під час запуску програми відразу відкривається браузер.

Щоб вирішити дану проблему і відкривати посилання в своїй програмі, потрібно перевизначити клас WebViewClient і дозволити нашому додатку обробляти посилання. Додамо в коді вкладений клас:

private class MyWebViewClient extends WebViewClient {@TargetApi (Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request) {view.loadUrl (request.getUrl (). toString ()); return true; } // Для старих пристроїв @Override public boolean shouldOverrideUrlLoading (WebView view, String url) {view.loadUrl (url); return true; }}

Потім в методі onCreate () визначимо екземпляр MyWebViewClient. Він може знаходитися в будь-якому місці після ініціалізації об'єкта WebView:

webView.setWebViewClient (new MyWebViewClient ());

Тепер в нашому додатку створений WebViewClient, який дозволяє завантажувати будь-який вказаний URL, обраний в WebView, в сам контейнер WebView, а не запускати браузер. За дану функціональність відповідає метод shouldOverrideUrlLoading (WebView, String), в якому ми вказуємо поточний WebView і потрібний URL. Значення, що повертається true говорить про те, що ми не потребуємо запуску стороннього браузера, а самостійно завантажимо контент за посиланням. У версії API 24 додали перевантажену версію методу, враховуйте цю обставину.

Повторно запустіть програму і переконайтеся, що посилання завантажуються тепер в самому додатку. Але тепер виникла ще одна проблема. Ми не можемо повернутися до попередньої сторінки. Якщо ми натиснемо на кнопку BACK (Назад) на своєму пристрої, то просто закриємо свій додаток. Для вирішення нової проблеми нам необхідно обробляти натискання кнопки BACK. Додаємо новий метод:

@Override public void onBackPressed () {if (webView.canGoBack ()) {webView.goBack (); } Else {super.onBackPressed (); }}

Ми повинні перевірити, що WebView підтримує навігацію на попередню сторінку. Якщо умова вірна, тоді викликається метод goBack (), який повертає нас на попередню сторінку на один крок назад. Якщо таких сторінок набралося кілька, то ми можемо послідовно повернутися до самої першій сторінці. При цьому метод завжди буде повертати значення true. Коли ми повернемося на найпершу сторінку, з якої почали подорож по інтернету, то повернеться значення false і обробкою натискання кнопки BACK займеться вже сама система, яка закриє вікні керування.

Відкрийте програму ще раз. У вас з'явився свій власний веб-браузер, що дозволяє ходити по посиланнях і повертатися на попередню сторінку. Вивчивши документацію, ви можете оснастити додаток і іншим смачними булочками для свого браузера.

Якщо вам потрібно частина посилань, що ведуть на ваш сайт відкривати в браузері, а локальні посилання відкривати в додатку, то застосовуйте умова з різними повертаються значеннями.

public class MyWebViewClient extends WebViewClient {@Override public boolean shouldOverrideUrlLoading (WebView view, String url) {if (Uri.parse (url) .getHost (). endsWith ( "developer.alexanderklimov.ru")) {return false; } Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse (url)); view.getContext (). startActivity (intent); return true; }}

Універсальний метод, який все локальні посилання відкриє в додатку, інші в браузері (міняємо одну сходинку):

public class MyAppWebViewClient extends WebViewClient {@Override public boolean shouldOverrideUrlLoading (WebView view, String url) {if (Uri.parse (url) .getHost (). length () == 0) {return false; } Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse (url)); view.getContext (). startActivity (intent); return true; }}

А зараз трохи ускладнити приклад, щоб у користувача з'явилася альтернатива стандартним браузерам.

Щоб було зрозуміліше, переробимо приклад наступним чином. Створіть дві активності. На першій активності розмістіть кнопку для переходу на другу активність, а на другий активності розмістіть компонент WebView.

У маніфесті прописуємо у другій активності фільтр.

<activity android: name = ". SecondActivity" android: label = "@ string / title_activity_second"> <intent-filter> <action android: name = "android.intent.action.VIEW" /> <action android: name = " ru.alexanderklimov.Browser "/> <category android: name =" android.intent.category.DEFAULT "/> <data android: scheme =" http "/> </ intent-filter> </ activity>

Код для кнопки для переходу на другу активність.

public void onClick (View view) {Intent intent = new Intent ( "ru.alexanderklimov.Browser"); intent.setData (Uri.parse ( "http://developer.alexanderklimov.ru/android/")); startActivity (intent); }

Ми створили власний намір із зазначенням фільтра і надали дані - адреса сайту.

Друга активність повинна прийняти дані:

package ru.alexanderklimov.testapplication; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class SecondActivity extends AppCompatActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); Uri url = getIntent (). GetData (); WebView webView = findViewById (R.id.webView); webView.setWebViewClient (new Callback ()); webView.loadUrl (url.toString ()); } Private class Callback extends WebViewClient {@Override public boolean shouldOverrideUrlLoading (WebView view, String url) {return (false); }}}

У фільтрі для другої активність ми вказали дві дії.

<Action android: name = "android.intent.action.VIEW" /> <action android: name = "ru.alexanderklimov.Browser" />

Це означає, що будь-які активності (читай, додатки) можуть викликати вашу активність з міні-браузером за таким же принципом. Запустіть в студії в окремому вікні будь-який старий проект або створіть новий і додайте в нього кнопку і пропишіть той же код, який ми використовували для клацання кнопки.

Запустіть другий додаток (перший додаток можна закрити) і натисніть на кнопку. У вас запуститься не перше додаток з початковим екраном, а відразу друга активність з міні-браузером. Таким чином, будь-який додаток може запустити браузер, не знаючи імені класу вашої активності, а використовуючи лише рядок "ru.alexanderklimov.Browser", передану в Intent. При цьому ваша активність з браузером повинна мати категорію за замовчуванням і дані. Нагадаю:

<Category android: name = "android.intent.category.DEFAULT" /> <data android: scheme = "http" />

Ви можете уявити свій рядок у вигляді строкової константи і повідомити всім потенційним користувачам вашого браузера, як вони можуть запустити його у себе. Але в Android вже є така готова константа ACTION_VIEW, яка за довідкою документації являє собою наступне:

public static final java.lang.String ACTION_VIEW = "android.intent.action.VIEW";

Перепишемо код для кнопки у другого додатка

Intent (android.content.Intent.ACTION_VIEW, Uri.parse ( "http://developer.alexanderklimov.ru/android/")); startActivity (intent);

Що станеться цього разу? Ми пам'ятаємо, що у нас прописано два дії, включаючи і android.intent.action.VIEW. А значить наше перше додаток з браузером теж має розпізнавати цю команду, коли якесь додаток у користувача використовує цей код. На емуляторі як мінімум є одна така програма "Browser", і тепер до неї додалася наша друга активність з першого додатка. На екрані з'явиться вибір з двох додатків.

А якщо видалити всі альтернативні браузери і залишити тільки вашу програму, то і вибору не буде. Ваш браузер стане основним. І якщо якийсь додаток захоче запустити веб-сторінку зазначеним способом, то відкриється ваша програма.

Невелике зауваження. Якщо замінити останню сходинку на таку:

startActivity (Intent.createChooser (intent, "Мяу ..."));

То у вікні вибору програми замість верхнього рядка "Open with" або її локального перекладу з'явиться ваша рядок. Але не це головне. Якщо з якихось причин в ньому не виявиться жодного браузера, то даний варіант коду не викличе краху додатки, на відміну від початкового варіанту. Тому використовуйте запропонований варіант заради надійності.

WebView

Обговорення статті на форумі.

Реклама
Quot; encoding = "utf-8"?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью