$30 off During Our Annual Pro Sale. View Details »

Android School 02

Android School 02

Formatowanie i stylizowanie łańcuchów znaków. Menu opcji, toasty, okna dialogowe i alerty. Intencje niejawne, własne filtry intencji.

Adam Jodłowski

March 23, 2013
Tweet

More Decks by Adam Jodłowski

Other Decks in Programming

Transcript

  1. 2 Odwoływanie się do zasobów • zasoby umieszczone w odpowiednich

    podkatalogach lub definiowane w XML (/res/values) zarządzane przez plik R, mają nadane symboliczne identyfikatory tekstowe @id/moj_przycisk @string/komunikat_sukces @drawable/logo • zasoby pobieramy programowo dzięki kontekstowi Drawable pic = getResources().getDrawable(R.drawable.pic); String hello = getResources().getString(R.string.hello); String[] arr = getResources().getStringArray(R.array.arr);
  2. 3 Formatowanie i stylizowanie łańcuchów znaków • znaczniki formatujące tekst

    <string name="hello"> Hello %1$s! </string> String formattedHello = String.format( getResources().getString(R.string.hello), "Android"); • ostylowanie tekstu za pomocą znaczników HTML <string name="goodbye"> &lt;font color=\"green\">Goodbye&lt;/font> &lt;b> %1$s&lt;/b>! </string> String formattedGoodbye = String.format(getResources().getString(R.string.goodbye ), "Android"); textView.setText(android.text.Html.fromHtml(formattedGo odbye));
  3. 4 Przejrzyj różne rodzaje zasobów istniejące w projekcie, pobierz je

    w kodzie, sformatuj i ostyluj treść TextView.
  4. 5 Menu opcji • strukturę menu opcji definiujemy jako plik

    XML w katalogu /res/menu <menu> korzeń pliku, jest kontenerem dla menu <group> grupuje elementy w jednej kategorii <item> reprezentuje pojedyńczy element, może zawierać zagnieżdżony element <menu> tworząc podmenu <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/informacje" android:icon="@drawable/informacje" android:title="@string/informacje" /> <item android:id="@+id/pomoc" android:icon="@drawable/pomoc" android:title="@string/pomoc" /> </menu>
  5. 6 Podpinanie menu opcji do aktywności • musimy przesłonić metodę

    zwrotną tworzenia menu i reakcji na wybór @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; // wyswietl menu } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.informacje: pokazInformacje(); return true; case R.id.pomoc: pokazPomoc(); return true; default: return super.onOptionsItemSelected(item); } }
  6. 7 Toasty • podstawowy mechanizm nieinwazyjnych powiadomień Toast toast =

    Toast.makeText(kontekst, wiadomosc, czas trwania); toast.show(); • czas trwania to jedna z dwóch stałych Toast.LENGTH_SHORT i Toast.LENGTH_LONG • możemy wypozycjonować toast na ekranie toast.setGravity(...); używając flag zdefiniowanych w android.view.Gravity.* i podając wielkości marginesów (w pikselach) • możemy ustawić layout całego toastu na własny (uwaga na root!) LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root)); toast.setView(layout);
  7. 8 Stwórz menu (opcjonalnie z zagnieżdżeniem) i podepnij je do

    aktywności. Wyświetl Toast na naciśnięcie przycisku menu, zmień jego domyślną pozycję, ustaw marginesy w jednostkach niezależnych od gęstości (dp) korzystając z programowego pobierania zasobów typu dimen.
  8. 9 Okna dialogowe • są modalne, asynchroniczne i zarządzane •

    najprostszym sposobem na utworzenie okna dialogowego jest skorzystanie z buildera klasy AlertDialog AlertDialog.Builder dialog = new AlertDialog.Builder(aktywnosc); dialog.setTitle("Potwierdzenie"); dialog.setMessage("Zapisac zmiany?"); dialog.setPositiveButton("Tak", listener); dialog.setNegativeButton("Nie", listener); dialog.setNeutralButton("Anuluj", listener); dialog.show(); • Klasa listenerów to DialogInterface.OnClickListener()
  9. 10 Dialog z listą checkboksów • przykład bardziej złożonego dialogu

    final String[] colors = new String[] {"niebieski", "biały", "czerwony"}; AlertDialog.Builder dialog = new AlertDialog.Builder(activity); dialog.setTitle("Wybierz kolory"); dialog.setMultiChoiceItems(colors, new boolean[] {false, true, false}, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // reakcja na klikniecie checkboksa } }); dialog.setPositiveButton("Zatwierdz", listener); dialog.setNegativeButton("Anuluj", listener); dialog.show();
  10. 12 Zezwolenia • wiele czynności systemowych wymaga zezwoleń udzielonych przez

    użytkownika podczas instalacji aplikacji (wysyłanie SMS, odbieranie połączeń, łączenie z Internetem, itd.) • dodajemy je w manifeście, zakładka Permissions > Add > Uses Permission • CALL_PHONE, CAMERA, INTERNET, VIBRATE, ... • próba wykonania czynności, na którą aplikacja nie otrzymała zezwolenia, zakończy się niepowodzeniem
  11. 13 Intencje niejawne • poznaliśmy dotychczas intencje jawne (explicit), dzięki

    którym przechodziliśmy pomiędzy aktywnościami naszej własnej aplikacji • w intencji niejawnej (implicit) nie specyfikujemy nazwy (klasy) komponentu docelowego • podajemy nazwę akcji do wykonania i opcjonalnie dane (data) w postaci URI, ich typ MIME, kategorię intencji i wartości extras • określamy jaką czynność chcemy wykonać, ale nie musimy znać komponentu, który to potrafi (nie mamy też gwarancji, że takowy istnieje w systemie)
  12. 14 Intencje niejawne • aktywności odpalamy w sposób tradycyjny Intent

    intent = new Intent(akcja, [URI]); startActivity(intent); • przykładowe parametry dla intencji systemowych Intent.ACTION_VIEW Uri.parse("http://www.android.com") Intent.ACTION_CALL Uri.parse("tel:(+48)111222333") Intent.ACTION_DIAL Uri.parse("tel:(+48)111222333") Intent.ACTION_VIEW Uri.parse("geo:52.408333,16.908333?z=18") Intent.ACTION_VIEW Uri.parse("http://maps.google.com/maps?saddr=" + s_lat + "," + s_lon + "&daddr=" + d_lat + "," + d_lon) Intent.ACTION_VIEW Uri.parse("market://details?id=com.rovio.angrybirds")
  13. 16 Jak to działa? • aktywności, usługi (services) i odbiorcy

    komunikatów rozgłoszeniowych (broadcast receivers) mogą deklarować filtry intencji • intencje niejawne przechodzą przez te filtry i trafiają do wszystkich pasujących do nich komponentów, deklarujących ich obsługę • chęć odbioru intencji rejestrujemy w manifeście, w węźle danego komponentu – ustalamy nazwę akcji i jej schemat URI w postaci <activity android:name=".Calculator" android:label="Kalkulator"> <intent-filter> <action android:name="training.android.calculate" /> </intent-filter> </activity> • aby ograniczyć obsługiwane intencje do specyficznych przypadków, możemy dodać kolejne węzły filtrujące <data android:scheme="http" android:host="google.com" android:port="80" android:path="/search" /> <category android:name="android.intent.category.DEFAULT" /> • dokumentacja zawiera informacje o priorytetach składowych filtrów
  14. 17 Reakcja na intencję niejawną • jeśli intencja pasuje do

    jednego z filtrów komponentu i ma on najwyższy priorytet albo zostanie ręcznie wybrany przez użytkownika – zostanie on uruchomiony przez system operacyjny • przykładowa aktywność odbierająca intencję, może odczytać akcję, składowe URI i inne dane pomocnicze, aby sprawdzić, czy dane wejściowe są poprawne Intent intent = getIntent(); String action = intent.getAction(); String uriPath = intent.getDataString(); if (uruchomiono aktywnosc przez odpowiednia intencje) { // przetwarzamy dane... } • w razie potrzeby, zamykamy aktywność odbiorczą i zwracamy rezultat
  15. 18 W pierwszej aplikacji zaimplementuj nową aktywność przyjmującą intencję swojego

    własnego typu, przetestuj jej działanie wywołując tę intencję niejawną z drugiej, osobnej aplikacji. Stwórz trzecią aplikację z aktywnością zdolną do przetworzenia tej samej intencji niejawnej co pierwsza aplikacja, odpal intencję niejawną w drugiej aplikacji i zaobserwuj co się stanie.
  16. 19 Zadanie domowe: Połącz wiedzę z dotychczasowych warsztatów i stwórz

    przykładową aplikację demonstrującą poznane techniki.