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);
}

Podobne dokumenty