Baza Wiedzy

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

 

Najlepszy newsletter o Javie w Polsce

Czy chcesz otrzymywać nowości ze świata Javy oraz przykładowe pytania rekrutacyjne? Zapisz się na newsletter i bądź na bieżąco! Otrzymasz także ekskluzywne materiały oraz informacje o nowych kursach i promocjach.

Traktujemy Twoją prywatność poważnie. Nikomu nie udostępniamy Twojego maila no i zawsze możesz się wypisać.

Komentarze do artykułu

Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe 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

Kurs Java WrocławJavaStart na Youtube