Klasy źródłowe – tutaj piszemy nasz kod.
2. R.java – Klasa generowana przez środowisko, która łączy część programistyczną z zasobami.
3. Binarki - są generowane przez środowisko,mało interesujące, tutaj raczej nie zaglądamy.
4. Zasoby (z ang. resources). Tutaj znajduje się wszystko co można oddzielić od kodu (obrazki, animacje, layouty, dźwięki, a nawet tekst)
5. AndroidManifest.xml - Zawiera informacje która Aktywność (klasa) powinna zostać uruchomiona jako pierwsza, jakich zezwoleń wymaga aplikacja, jaką ma nazwę itd.
Debugowanie USB:
Ważna kwestia w programowaniu na androida to testowanie aplikacji na fizycznym urządzeniu. Często ułatwia nam to życie, gdy testujemy bardziej wymagające aplikacje, na przykład korzystające z kamery urządzenia. Kolejną niewątpliwą zaletą debugowania przez USB jest oszczędność czasu. O ile w przypadku słabszych komputerów użytkowanie symulatora androida może być obciążające, o tyle proces wdrożenia na fizyczny telefon jest zwykle prosty i niezwykle krótki.
ustawienia -> opcje programistyczne
*debugowanie usb
* pozorowanie lokalizacji- zagadnienia z geolokacją
* pozostaw wlączony – kiedy często sprawdzamy zmiany, faza końcowa
Konfiguracja telefonu
Konfiguracja komputera – podłączamy telefon, instalujemy sterowniki (z karty telefonu lub z Internetu)
Wdrażanie projektu na telefon- - odpalamy Eclipse z pluginem ADT. Algorytm jest taki sam jak zwykle, klikamy na projekcie prawym przyciskiem myszy, wybieramy Run as a następnie Android Application. Niezwykle ważne jest, aby wersja Androida, któremu dedykujemy aplikację była zgodna z posiadaną przez nas na telefonie, gdyż Eclipse dynamicznie przydziela odpowiednim projektom odpowiednie urządzenia. Stąd też gdy podłączymy telefony z systemem 2.3.3 i 4.0.3, oraz stworzymy dwa takie projekty, to każdy z nich będzie widział tylko „swoj” telefon.
*„Use same device for future launches”, aby przy każdej kompilacji nie wybierać urządzenia ponownie
Programy:
Android dostarcza wielu kontrolek i wigetów. Korzystanie z podstawowych kontrolek jest niezwykle proste. Wystarczy przeciągnąć metodą drag and drop wybrany widget na ekran. Usuwanie realizujemy zaznaczając element i naciskając klawisz delete.
WAŻNE: Aby dostać się do kontrolki z poziomu kodu musimy znać jego id. Id ustawiamy klikając prawym przyciskiem myszy na elemencie i wybierając opcję: Assign ID… Następnie wpisujemy naszą nazwę i gotowe.
MENU: /tekst/obrazek/tekst+obrazek/
Tworzenie za pomocą XML
Kod który dodajemy do Activity w którym chcemy aby pojawiało się menu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Tworzenie z poziomu kodu
public static final int PIERWSZY_ELEMENT = 1;
public static final int DRUGI_ELEMENT = 2;
public static final int TRZECI_ELEMENT = 3;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, PIERWSZY_ELEMENT, 0, "Jeden");
menu.add(1, DRUGI_ELEMENT, 0, "").setIcon(R.drawable.android_icon);
menu.add(2, TRZECI_ELEMENT, 0, "Trzy").setIcon(R.drawable.android_icon);
return true;
}
Obsługa zdarzenia naciśnięcia przycisku menu
3.1 dla XML – wstawiamy ponizszy kod do Activity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
String ktoryElement = "";
switch (item.getItemId()) {
case R.id.item1:
ktoryElement = "pierwszy";
break;
case R.id.item2:
ktoryElement = "drugi";
break;
case R.id.item3:
ktoryElement = "trzeci";
break;
default:
ktoryElement = "żaden";
}
Toast.makeText(getApplicationContext(), "Element: " + ktoryElement,
Toast.LENGTH_LONG).show();
return true;
}
3.2 menu tworzone w kodzie:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
String ktoryElement = "";
switch (item.getItemId()) {
case PIERWSZY_ELEMENT:
ktoryElement = "pierwszy";
break;
case DRUGI_ELEMENT:
ktoryElement = "drugi";
break;
case TRZECI_ELEMENT:
ktoryElement = "trzeci";
break;
default:
ktoryElement = "żaden";
}
Toast.makeText(getApplicationContext(), "Element: " + ktoryElement, Toast.LENGTH_LONG).show();
return true;
}
Każdy widok, który chcemy wyświetlić na ekranie musi dziedziczyć po Activity. Daje nam to możliwość nadpisania niektórych jej metod. Najczęściej używane jest tylko onCreate():
Lineral Layout(Horizontal)- od lewej do prawej
Lineral Layout (Vertical) – z góry na dół
Relative layout- elementy ukladają się zależnie od innych elementów
Frame Layout- sluży do przechowywania tylko jednego widoku, który ma być widoczny nad innym
Akcelerometr osadzony w tabletach lub smartfonach służy zazwyczaj do odpowiedniego dobierania orientacji w zależności od kąta nachylenia, daje nam to okazje do stworzenia lepszego interfejsu użytkownika ponieważ za każdą zmianą orientacji stoi także ponowne nadmuchiwanie layoutu, czyli wywoływana jest metoda onCreate().
Wyobraźmy sobie ,że nasza aplikacja dostarcza tylko standardowy layout – ten layout zawiera ListView wyświetlający n elementów, w momencie naciśnięcia elementu(wywołania metody onListItemClick()) przenosimy się do kolejnego widoku w którym przedstawiamy szczegóły dotyczące ów elementu.
W momencie obrotu telefony, nic się na razie nie zmieni(poza orientacją oraz zmianą szerokości i wysokości), ponieważ nie dostarczyliśmy layoutu dla orientacji landscape, robiąc to moglibyśmy osiągnąć na przykład taki efekt:
Dla pewności, widok podstawowy(„normalny”) oraz obrócony, definiujemy odpowiednio jako:
Portrait (wysokość > szerokość)
Landscape (wysokość < szerokość)
Wdrożenie: Zastosowanie tego w praktyce nie wymaga od nas specjalnego nadwyrężania się. Android sam „wie” kiedy który layout zastosować, wymaga od nas tylko żeby odpowiednie layouty wrzucić do odpowiednich folderów, a w zasadzie jednego nowego folderu, który musimy nazwać layout-land, następnie w nim, tworzymy nowy layout, który ma obsługiwać orientacje landscape.
Na pewno przyjdzie konieczność zmiany jakiegoś elementu w kodzie w zależności od aktualnej orientacji urządzenia. Taka operacja także nie jest trudna, wywołujemy metodę getConfiguration() która należy do klasy Resources – aktualny zasób możemy natomiast zdobyć przy pomocy metody getResources(),
1 | getResources().getConfiguration().orientation |
---|
Przykład jak można zastosować takie sprawdzenie:
/* ze względu na to ze chce dla różnych orientacji inaczej wypełnić fragmenty,muszę sprawdzić w jakiej aktualnie orientacji się znajduje. */
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
PersonFragment articleFrag = (PersonFragment)
getSupportFragmentManager().findFragmentById(R.id.detail_container);
articleFrag.updateArticleView(person);
//Ląduje tutaj w przypadku kiedy aktualną orientacją jest landscape.
}else{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
args.putSerializable("context", person);
newFragment.setArguments(args);
transaction.replace(R.id.fragment_container, newFragment);
ransaction.addToBackStack(null);
transaction.commit();
}