AndroidManifest.xml Plik manifestu opisuje podstawowe
Transkrypt
AndroidManifest.xml Plik manifestu opisuje podstawowe
AndroidManifest.xml Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty. Jednym z najważniejszych elementów jest element <uses-sdk> który deklaruje kompatybilność z innymi wersjami androida. android:minSdkVersion określa minimalna wersje z która aplikacja jest kompatybilna, android:targetSdkVersion oznacza docelową wersje. Zawsze powinno się docelową kompatybilność ustawiać na najwyższą. Foldery w projekcie: src/ główne pliki źródłowe, domyślnie zawiera klasę aktywności która uruchamia się przy uruchamianiu aplikacji res/ Zawiera pod foldery z zasobami aplikacji, na przykład: drawable-hdpi/ Folder zawierający obiekty rysowane (np. bitmapy), na urządzenia z dużą gęstością pikseli (hdpi) layout/ Folder z plikami definiującymi interfejs użytkownika values/ Folder zawiera pliki XML zawierającym kolekcje danych, definicje kolorów, stringi itd. Przy uruchamianiu domyślnej aplikacji androidowej, uruchamiana jest najpierw domyślna klasa aktywności (Activity class). Klasa ta wgrywa plik layoutu który wyświetla „Hello World”. Graficzny interfejs użytkownika w aplikacjach androidowych budowany jest wykorzystując hierarchie widoków (View) oraz grup widoków (ViewGroup). Obiekty widoku to zazwyczaj takie elementy UI jak przyciski albo pola tekstowe. Obiekty widoku grupy to niewidzialne pojemniki definiujące w jaki sposób podrzędne widoki są ustawione na siatce albo pionowej liście. Przykład aplikacji z liniowym UI <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > </LinearLayout> LinearLayout jest grupa widoku która układa podrzędne widoki w pionie lub poziomie, zgodnie z atrybutem android:orientation. Wszystkie dzieci pokazują się zgodnie z kolejnością wpisania w xmlu. Atrybuty android:layout_width oraz android:layout_height oznaczają wielkość i są wymagane. Ponieważ LinearLayout jest głównym widokiem, powinno zapełniać cały ekran, dlatego ustawiamy „match_parent”. Wartość ta oznacza ze widok jest rozszerzony aby dopasować się do widoku nadrzędnego. Dodając poniższe wewnątrz <LinearLayout> otrzymamy pole tekstowe <EditText android:id="@+id/edit_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/edit_message" /> android:id – daje polu unikatowy identyfikator którzy umożliwia tworzenie odwołań do obiektu z poziomu kodu. Znak małpy jest wymagany podczas odwoływania się do zasobów za pomocą XML-a. Za znakiem @ znajduje się typ (np. id albo string), potem slash (/) i nazwa zasobu (edit_message). Znak + przed typem jest potrzebny tylko przy definiowaniu ID zasobów po raz pierwszy. Podczas kompilowania aplikacji SDK używa ID do stworzenia nowego ID zasobu w folderze gen/R.java. Atrybuty wrap_content użyte zamiast wysokości i szerokości określają, że elementy powinny być tylko tak duże, aby zmieścić się w widoku. (Gdybyśmy użyli zamiast tego „match_parent” wówczas element zapełniłby cały ekran przyjmując rozmiar rodzica -LinearLayout. android:hint – String który ma zostać wypisany jeżeli pole tekstowe jest puste. Wartości @string/edit_message odwołują się do danych z folderu res/values/strings.xml, aby poprawnie skompilować program, musimy je tam dodać: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My First App</string> <string name="edit_message">Enter a message</string> <string name="button_send">Send</string> <string name="action_settings">Settings</string> <string name="title_activity_main">MainActivity</string> </resources> Ostatnim elementem będzie przycisk, w tym celu w <EditText> dopisujemy: <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" /> Aby rozszerzyć długość pola tekstowego na całą dostępna wielkość należy nadać mu pewną wagę. Domyślnie wszystkie elementy mają wagę ustawioną na 0. Ustawienie czegokolwiek większego dla tylko jednego elementu spowoduje rozszerzenie go na cały wolny obszar: <EditText android:layout_weight="1" android:layout_width="0dp" … Ustawienie szerokości na 0 przyspiesza generowanie UI w porównaniu do wcześniejszego wrap_content. Aby odpowiedzieć na naciśnięcie przycisku należy dodać w pliku activity_main.xml android:onClick do elementu <Button /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" /> Atrybut „sendMessage” jest nazwą metody w naszej aktywności która wywoła system po wciśnięciu buttona. Aktywność nasza znajduje się w src/MainActivity. Musimy tam dodać odpowiednią metodę: /** Uruchamiane po wcisnieciu przycisku */ public void sendMessage(View view) { // zrob cos po wcisnieciu przycisku } Metoda z poprzedniego slajdu wymaga zaimportowania klasy View: import android.view.View; Co można zrobić automatycznie wciskając Ctrl+Shift+O Aby metoda ta odpowiadała metodzie wywoływanej w android:onClick musi ona być publiczna, zwracać void i mieć View jako jedyny parametr. W celu połączenia ze sobą dwóch komponentów (np. dwie czynności) musimy wykorzystać tak zwany intent ('intencja'). Reprezentuje on 'intencje aplikacji' do zrobienia czegoś. Wewnątrz utworzonego przed chwilą sendMessage() tworzymy obiekt Intent: Intent intent=new Intent(this, DisplayMessageActivity.class); Jej konstruktor przyjmuje dwa parametry: Kontekst oraz klasę komponentu aplikacji do którego wysyłamy nasz intent (w naszym przypadku ma być wysłany do nowej aktywności, która jeszcze nie istnieje). Dodatkowo Intent potrafi poza uruchamianiem aktywności dostarczyć także pewne dane, nasz intent 'przewiezie' zawartość pola tekstowego: Intent intent = new Intent(this, DisplayMessageActivity.class); EditText editText = (EditText) findViewById(R.id.edit_message); String message = editText.getText().toString(); intent.putExtra(EXTRA_MESSAGE, message); Metoda putExtra() przyjmuje wartość pewnego klucza w pierwszym parametrze oraz jego wartość jako drugi parametr. Aby nasz intent zadziałał i poprawnie przeniósł dane musimy zdefiniować odpowiedni klucz, w naszym przypadku np.: public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... } Dobra praktyką jest nazywanie kluczy używając nazwy pakietu jako prefiksu w przypadku gdyby nasz program działał z innymi. Aby uruchomić drugą aktywność wystarczy dodać kolejną linijkę do sendMessage(): startActivity(intent); Jedyne czego nam brakuje to klasa DisplayMessageActivity. Najpierw dodajemy nową aktywność: 1. New->Android->Activity 2. BlankActivity 3. Project: NazwaJakaś Activity Name: DisplayMessageACtivity Layout Name: activity_display_message Title: tytul Hierarchial Parent: com.example.myfirstap.MainActivity Navigation Type: None 4. Finish W naszym programie będziemy korzystać z API ActionBar który wymaga androida w wersji co najmniej honeycomb (api level 11). W tym celu musimy wokół metody getActionBar() sprawdzić którą wersję API mamy. Wymagane jest także dodanie @SuppressLint(„NewApi”) w celu uniknięcia błędów. Po powyższych zmianach dostajemy nową aktywność: public class DisplayMessageActivity extends Activity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Pokarz przycisk do gory w action barze: getActionBar().setDisplayHomeAsUpEnabled(true); } } ... Wszystkie aktywności muszą być zadeklarowane w pliku manifestu, Eclipse wpis do manifestu powinien zrobić automatycznie: <application ... > ... <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application> Atrybut android:parentActivityName oznacza aktywność nadrzędną. System wykorzystuje te informację do nawigowania po programie (np. wstecz). Następnym krokiem jest wydobycie informacji z intentu wewnątrz metody onCreate() klasy DisplayMessageActivity: Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); Na koniec musimy wygenerować widget TextView i ustawić jego tekst za pomocą metody setText(). Dalej TextView ustawiamy jako główny element aktywności za pomocą setContentView(): @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Wiadomosc z intentu Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); // Tworzenie widoku tekstu TextView textView = new TextView(this); textView.setTextSize(40); textView.setText(message); // Wyswietlenie widoku tekstu setContentView(textView); }