Chciałbym, aby tablety mogły wyświetlać się w orientacji pionowej i poziomej (w rozdzielczości sw600dp lub większej), ale telefony powinny być ograniczone tylko do portretu. Nie mogę znaleźć żadnego warunkowego wyboru orientacji. Jakieś sugestie?
android
tablet
screen-orientation
Kenny Wyland
źródło
źródło
layout-land
wewnętrznegores
.Odpowiedzi:
Oto dobry sposób na użycie kwalifikatorów zasobów i rozmiaru .
Umieść ten zasób bool w res / wartości jako bools.xml lub cokolwiek innego (nazwy plików nie mają tutaj znaczenia):
Umieść to w res / wartości-sw600dp i res / wartości-xlarge:
Zobacz tę dodatkową odpowiedź aby uzyskać pomoc dotyczącą dodawania tych katalogów i plików w Android Studio.
Następnie w metodzie onCreate swoich działań możesz to zrobić:
Urządzenia o rozdzielczości większej niż 600 dp w kierunku najmniejszej szerokości lub x-large na urządzeniach z systemem Android w wersji wcześniejszej niż 3.2 (zasadniczo tablety) będą zachowywać się normalnie, w oparciu o czujnik i obrót zablokowany przez użytkownika itp . Wszystko inne (telefony, właściwie) będzie tylko portretem.
źródło
xlarge
czy mogę po prostu używaćsw600dp
? Prawdopodobnie obecnie nie ma tabletów z <3.2.onCreate()
. Kiedy przeniosłem połączenie nasetRequestedOrientation()
inną pozycję w czasie i kontekście, restart się nie powtórzył.Możesz spróbować w ten sposób najpierw uzyskać rozmiar ekranu urządzenia
a następnie ustaw zgodnie z tym orientację
źródło
Configuration
dostarczascreenLayout
informacje - DPI. Pytanie dotyczy natomiast wielkości ekranu urządzenia fizycznego - telefonu VS tabletu. Oznacza to, że możesz miećConfiguration.SCREENLAYOUT_SIZE_NORMAL
i byłby to tablet MDPI.Uzupełnienie przyjętej odpowiedzi
Możesz wykonać następujące kroki w Android Studio, aby dodać do nich katalogi
res/values-sw600dp
ires/values-large
bools.xml
plikami.wartości-sw600dp
Przede wszystkim z zakładki Projekt wybierz filtr Nawigatora (zamiast Androida) w nawigatorze.
Następnie kliknij
app/src/main/res
katalog prawym przyciskiem myszy . Wybierz Nowy > Katalog zasobów Androida .Wybierz opcję Najmniejsza szerokość ekranu , a następnie naciśnij przycisk >> .
Wpisz
600
najmniejszą szerokość ekranu. Nazwa katalogu zostanie wygenerowana automatycznie. Powiedz ok.Następnie kliknij prawym przyciskiem myszy nowo utworzony
values-sw600dp
plik. Wybierz Nowy > Plik zasobów wartości . Rodzajbools
nazwę.duże wartości
Dodanie
values-large
katalogu jest konieczne tylko w przypadku obsługi systemu Android w wersji wcześniejszej niż 3.2 (API poziom 13). W przeciwnym razie możesz pominąć ten krok.values-large
Katalogu odpowiadavalues-sw600dp
. (values-xlarge
odpowiadavalues-sw720dp
.)Aby utworzyć
values-large
katalog, wykonaj te same kroki, co powyżej, ale w tym przypadku wybierz opcję Rozmiar zamiast Najmniejszej szerokości ekranu. Wybierz Large . Nazwa katalogu zostanie wygenerowana automatycznie.Kliknij katalog prawym przyciskiem myszy, aby utworzyć
bools.xml
plik.źródło
Oto jak to zrobiłem (zainspirowany http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
W AndroidManifest.xml dla każdej aktywności, którą chcesz mieć możliwość zmiany między portretem a krajobrazem (pamiętaj, aby dodać screenSize - nie było to potrzebne!) Nie musisz tutaj ustawiać orientacji ekranu. :
Metody dodawania w każdym działaniu:
i: (jeśli nie zastąpisz tej metody, aplikacja wywoła funkcję onCreate () podczas zmiany orientacji)
W funkcji onCreate () każdego działania:
Jedyne, czego nie potrafię zrozumieć, to jak zmusić aplikację do zmiany plików układu podczas przełączania z orientacji poziomej na pionową lub odwrotnie. Zakładam, że odpowiedzią jest zrobienie czegoś podobnego do powyższego linku, ale nie mogłem tego zrobić dla mnie - usunęło to wszystkie moje dane. Ale jeśli masz na tyle prostą aplikację, że masz ten sam plik układu dla portretu i krajobrazu, to powinno działać.
źródło
Po odpowiedzi Ginny uważam, że najbardziej wiarygodnym sposobem jest:
Jak opisano tutaj , umieść wartość logiczną w zasobach sw600dp. Musi mieć prefiks sw, w przeciwnym razie nie będzie działał poprawnie:
w res / wartości-sw600dp / dimens.xml
w res / wartości / dimens.xml
Następnie utwórz metodę odzyskania wartości logicznej:
I podstawowe działanie, które należy rozszerzyć z działań, w których chcesz tego zachowania:
Dlatego każde działanie rozszerzy BaseActivity:
Ważne : nawet jeśli przedłużasz
BaseActivity
, musisz dodać linięandroid:configChanges="orientation|screenSize"
do każdegoActivity
z pliku AndroidManifest.xml:źródło
Cóż, jest to trochę za późno, ale tutaj jest tylko XML, ale rozwiązanie hakerskie, które nie odtwarza działania tak
setRequestedOrientation
, jakby miało zmienić orientację:https://stackoverflow.com/a/27015879/1281930
źródło
Po zaakceptowaniu odpowiedzi dodaję plik kotlin z rozwiązaniem, mam nadzieję, że komuś pomoże
Umieścić ten zasób bool w
res/values
jak bools.xml lub cokolwiek (nazwy plików nie ma znaczenia tutaj):Włóż to
res/values-sw600dp
ires/values-sw600dp-land
:Następnie dodaj go poniżej linii w swojej aktywności lub fragmentacji
źródło
Inne rozwiązania nie działały dla mnie. Nadal miałem dziwny problem z orientacją związany z dialogami i problemami z rekreacją. Moim rozwiązaniem było rozszerzenie działania, zmuszając go jako manifest w portrecie.
Przykład:
manifest.xml:
w działaniu ekranu powitalnego:
źródło
Stare pytanie, które znam. Aby aplikacja działała zawsze w trybie pionowym, nawet gdy orientacja może być lub jest zamieniona itp. (Na przykład na tabletach), zaprojektowałem tę funkcję, która służy do ustawiania urządzenia we właściwej orientacji bez konieczności poznawania orientacji pionowej i poziomej funkcje są zorganizowane na urządzeniu.
Działa jak marzenie!
UWAGA: Zmień
this.activity
według swojej aktywności lub dodaj ją do głównej aktywności i usuńthis.activity
;-)Jeśli chcesz zrobić odwrotnie, musisz zmienić kod na poziomy (ale myślę, że jest jasne, jak to zrobić).
źródło
Niestety przy użyciu metody setRequestedOrientation (...) spowoduje ponowne uruchomienie działania, więc nawet jeśli wywołasz to w metodzie onCreate, przejdzie przez cykl życia działania, a następnie odtworzy tę samą aktywność w żądanej orientacji. Dlatego w odpowiedzi @Brian Christensen powinieneś wziąć pod uwagę, że kod aktywności może zostać wywołany dwukrotnie, co może mieć złe skutki (nie tylko wizualne, ale także na żądania sieciowe, analizy itp.).
Ponadto ustawienie atrybutu configChanges w manifeście jest moim zdaniem dużym kompromisem, który może wymagać ogromnych kosztów refaktoryzacji. Android Devs nie zaleca zmiany tego atrybutu .
Wreszcie próba ustawienia nieco innej orientacji ekranu (aby uniknąć problemu z ponownym uruchomieniem) jest niemożliwa, statycznie niemożliwa z powodu statycznego manifestu, którego nie można zmienić, programowo można wywołać tę metodę tylko w już rozpoczętym działaniu.
Podsumowanie: Moim zdaniem sugestia @Brian Christensen jest najlepszym kompromisem, ale należy pamiętać o problemie z ponownym uruchomieniem.
źródło