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