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ąć inny layout.

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.

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

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

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