Screen orientation

 

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ść)

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 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 grupe 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