poniedziałek, 17 lutego 2014

Otwieranie przeglądarki WWW z aplikacji

Kod źródłowy do tej lekcji znajduje się tutaj. Rozpakuj go i zaimportuj. W katalogu z kodem źródłowym znajdą się podkatalogi oznaczone numerami. Są to po prostu kolejne wersje kodu, tworzonego w ramach przykładów. Możesz analizować kolejne kroki tworzenia aplikacji, lub od razu zabrać się za kod z katalogu o najwyższym numerku.

W tym przykładzie pokażę w jaki sposób możemy otworzyć zewnętrzną (domyślną) przeglądarkę z poziomu aplikacji. Zaczynam jak zawsze od najprostszego przykładu. Stworzyłem nowy projekt i przykleiłem guzik z napisem „Gugiel!”. Po naciśnięciu przycisku powinna zostać uruchomiona przeglądarka z uruchomionym adresem http://google.pl



Przechodzimy teraz do kodu aktywności. Linia 18 to podpięcie referencji do guzika. Muszę to zrobić by móc siędo niego odwoływać. Linie 19-27 to podpięcie listenera pod kliknięcie guzika Właściwa akcja dzieje się w linijkach 22-24 i w zasadzie tylko do nich się ogranicza. Adres który ma zostać otwarty będę musiał przekazać jako obiekt klasy Uri, tworzę więc go w oparciu o adres http://google.pl. Tu może być np. strona Twojej firmy, albo link do wyszukiwarki z przekazanymi przez pasek parametrami. Aby uruchomić przeglądarkę musimy stworzyć podając adres uri i wywołać nową intencję – co zawiera się w liniach 23,24.



Ekran po uruchomieniu:



Po naciśnięciu przycisku uruchomiła mi się domyślna przeglądarka z uruchomionym wskazanym adresem:


Troszkę przerobimy teraz naszą aplikację. Użytkownik sam wpisze adres strony która ma zostać wywołana. Dodaję do widoku element EditText i zmieniam tekst na guziku:


Musi za tym iść mała przeróbka w kodzie. Interesują nas linie 23 i 24. W linii 23 dodałem uchwyt do okienka edycyjnego. W linii 24 konkatenuję adres url na podstawie początku http:// (bo o tym pewnie każdy użytkownik zapomni, a bez tego nie zadziała) oraz tekstu wpisanego w oknie edycyjnym. Pozostała część programu pozostaje bez zmian.


Uruchomiłem program i wpisałem adres strony internetowej:


Po uruchomieniu:




Jeszcze jedna ciekawostka, aczkolwiek bardziej w charakterze „bajeru”. Jeśli odnajdziemy w pliku określającym layout element odpowiedzialny za nasz EditText i dopiszemy android:inputType=”textUri”, to po kliknięciu na okienko do wprowadzania tekstu wyskoczy nam klawiatura ze specjalnymi guzikami do wprowadzania adresów URL np. „www” :)


Tych inputType'ów jest znacznie więcej rodzajów, między innymi do wprowadzania adresów email, liczb etc .

7 komentarzy:

  1. Cześć!

    Chciałbym zapytać, jak napisać kod aby podczas wprowadzania tekstu, wciśnięcie przycisku "ENTER" chowało klawiaturę, a nie przechodziło do następnej linii?

    OdpowiedzUsuń
  2. Jestem początkującym. Przepisałem dokładnie cały kod. Podkreśla mi błąd w wierszu: OnClickListener 1 = ........... opis błędu : OnClickListener can not be resolved to a variable ..... może ktoś pomoże?

    OdpowiedzUsuń
    Odpowiedzi
    1. Zdaje się, że nie aż tak dokładnie, ale pomyłka jest zrozumiała. To jest l (el) a nie 1 (jeden).

      Usuń
    2. Tak, a ponadto nie można utworzyć zmiennej o nazwie zaczynającej się od cyfry. To już powinieneś na tym etapie programowania wiedzieć, skoro posługujesz się już obiektami, rzutowaniem... :P

      Usuń
    3. Moim zdaniem niekoniecznie trzeba wiedzieć na tym etapie, że zmienne nie mogą zaczynać się od cyfr. Metoda prób i błędów może potrafi więcej nauczyć niż przeczytanie 1000 stron książki o programowaniu w Javie... bo kto to wszystko spamięta ?

      Usuń
    4. Moim zdaniem trzeba... Jeszcze się nie spotkałem z kursem Javy który by od tego nie zaczynał. Skoro ktoś nie wie o czymś takim, to skąd bierze wiadomości do zrozumienia mechanizmów wykorzystywanych w tym kursie? Nie trzeba czytać 1000 stron książki o programowaniu w Javie, ale nauka bez podstaw jest bez sensu. Coś jak nauka biegania bez nauczenia się chodzenia...

      Usuń

  3. dla was to pewnie pikus, ale ja mam problem, chce aby program przed rozpoczeciem wczytywania strony z serwera wyswietlil statyczna strone html i informacja o sprawdzaniu polaczenia, jesli to polaczenie bedzie to wyswietlam strone startWebView("http://www.test.com/index.html"); jesli zabraknie polaczenia to wyswietli sie strona lokalna html z informacja o braku polaczenia
    no i jak by si edalo by kazde odwolanie/klikniecie w WebView sprawdzalo czy jest internet dostepny.. a jak nie to znowu strona lokalna z informacja ze polaczenia nie ma itp..

    pomoze ktos ?

    teraz mam taki kod:

    package com.androidexample.webview;

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;

    public class ShowWebView extends Activity {


    private WebView webView;
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.show_web_view);

    webView = (WebView) findViewById(R.id.webView1);
    startWebView("http://www.test.com/index.html");

    }


    private void startWebView(String url) {

    webView.setWebViewClient(new WebViewClient() {
    ProgressDialog progressDialog;

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
    }

    //pokazuje loader
    public void onLoadResource (WebView view, String url) {
    if (progressDialog == null) {

    progressDialog = new ProgressDialog(ShowWebView.this);
    progressDialog.setMessage(" Czekaj...");
    progressDialog.show();
    }
    }
    public void onPageFinished(WebView view, String url) {
    try{
    if (progressDialog.isShowing()) {
    progressDialog.dismiss();
    progressDialog = null;
    }
    }catch(Exception exception){
    exception.printStackTrace();
    }
    }

    });


    webView.getSettings().setJavaScriptEnabled(true);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setLoadWithOverviewMode(true);

    webView.loadUrl(url);


    }

    // cofanie

    @Override

    public void onBackPressed() {
    if(webView.canGoBack()) {
    webView.goBack();
    } else {

    super.onBackPressed();
    }
    }

    }

    OdpowiedzUsuń