Szkolenia programowania we Wrocławiu
Kurs Android

Screen orientation.

Szybki wstęp, czyli o co chodzi:

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(ang. user interface, UI), ponieważ za każdą zmianą orientacji stoi także ponowne nadmuchiwanie layoutu, czyli wywoływana jest metoda onCreate(). Tak więc pojawia się tu dla nas pole do popisu i kreatywności.

Dla przykładu, 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.

image03_framed

W momencie obrotu telefony, nic się na razie nie zmieni(po za 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:

Bez tytułu

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. Drzewko katalogu res wygląda tak:

http://img826.imageshack.us/img826/5749/previewu.png

Implementacja:

Na pewno przyjdzie Wam spotkać się z koniecznością 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(), czyli np:

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

 

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
Marcin

Krótko, zwięźle i na temat.

nieznasz

Przydałoby się odświeżenie obrazków zarówno w tym temacie jak i w tym dotyczącym actionBar