Wymusza tryb orientacji „portretowej”

298

Próbuję wymusić tryb „portretowy” dla mojej aplikacji, ponieważ moja aplikacja absolutnie nie jest przeznaczona do trybu „poziomego”.

Po przeczytaniu niektórych forów dodałem następujące wiersze do mojego pliku manifestu:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Ale to nie działa na moim urządzeniu (HTC Desire). Przełącza się z „pionowego” na „poziomy”, ignorując linie z pliku manifestu.

Po przeczytaniu kolejnych forów próbowałem dodać to do mojego pliku manifestu:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

i ta funkcja w mojej klasie aktywności:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Ale znowu nie ma szczęścia.

thomaus
źródło

Odpowiedzi:

531

Nie stosuj orientacji do elementu aplikacji , zamiast tego powinieneś zastosować atrybut do elementu aktywności i musisz również ustawić, configChangesjak wspomniano poniżej.

Przykład:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Jest to stosowane w pliku manifestu AndroidManifest.xml.

C0deAttack
źródło
26
Do czego służy configChanges?
Dror,
71
@Orchestrator, configChanges oznacza, że ​​zmiana konfiguracji jest obsługiwana przez samo działanie. Bez tego działanie zostanie wznowione, jeśli nastąpi zmiana orientacji. Możesz zapytać, jeśli określiłeś, że orientacja to „portret”, jak by się kiedykolwiek zmieniła? Może się zmienić, jeśli uruchomisz inne działanie, które zmienia orientację, a następnie to nowe działanie zostanie zakończone, co spowoduje powrót do działania. Na przykład domyślna intencja przechwytywania obrazu w Samsung Galaxy S3 robi to w niektórych orientacjach.
Gordon McCreight
2
@GordonMcCreight, czy możesz wyjaśnić to prawdziwym przykładem? Możesz zapytać, jeśli określiłeś, że orientacja to „portret”, jak by to się kiedykolwiek zmieniło? Może się zmienić, jeśli uruchomisz inną czynność, która zmienia orientację, to że nowa aktywność kończy się, co powoduje powrót do aktywności. ”
Tushar Pandey,
3
Jasne, @TusharPandey. O ile dobrze pamiętam, jednym z powodów, dla których nas to zasmuciło, było to, że nasza działalność uruchomiła domyślny sposób przechwytywania obrazu na Samsung Galaxy S3. Zasadniczo chcieliśmy po prostu zrobić zdjęcie i uzyskać wyniki. Jednak, gdy zamiar kamery powrócił, spowodowało to zmianę orientacji, która zniszczyła stan w naszej działalności, ponieważ nie wierzyliśmy, że musimy się przed tym zabezpieczyć (biorąc pod uwagę, że cała nasza aplikacja była tylko w orientacji „portretowej”). Jak i dlaczego Galaxy S3 to robi, nie rozumiem (co prawda ograniczone).
Gordon McCreight,
8
Dlaczego w zestawie jest „keyboardHidden”?
gonzobrains
24

Zauważ, że

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

jest dodawany do pliku manifestu - w którym zdefiniowano działanie.

Wskaźnik NULL
źródło
13

Myślę, że android:screenOrientation="portrait"można go wykorzystać do indywidualnych działań. Więc użyj tego atrybutu w <activity>tagu, takim jak:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
Pinki
źródło
13

Jeśli masz dużo aktywności, takich jak moja, w swojej aplikacji lub jeśli nie chcesz wpisywać kodu dla każdego tagu aktywności w manifestie, możesz to zrobić.

w klasie Application Base otrzymasz wywołanie zwrotne cyklu życia

więc w zasadzie to, co dzieje się w przypadku każdego działania podczas tworzenia w polu Application create w klasie aplikacji, wywoływane jest tutaj.

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

mam nadzieję, że to pomoże.

Muneef M.
źródło
1
Skuteczna odpowiedź! powinna to być poprawna odpowiedź, szczególnie dla tych, którzy opracowują złożone aplikacje, które w dużym stopniu zależą od dużej liczby działań.
FEBRYAN ASA PERDANA
10

Ustaw tryb wymuszania Portret lub Krajobraz , odpowiednio Dodaj linie.

Importuj poniżej linii:

import android.content.pm.ActivityInfo;

Dodaj poniżej linii tuż powyżej setContentView(R.layout.activity_main);

Do portretu :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

W przypadku Landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

To na pewno zadziała.

Parth Patel
źródło
1
To nie działa z Androidem 9 na niektórych urządzeniach - przejście do obrotu ekranu jest widoczne przez chwilę, nawet jeśli używasz tylko PORTRETU
Igor Wojda
Czy możesz podać informacje o urządzeniu, w którym się z tym
zmierzysz
4

Zgodnie z dokumentacją systemu Android często należy również uwzględnić screenSizejako możliwą zmianę konfiguracji.

android:configChanges="orientation|screenSize"

Jeśli aplikacja jest ukierunkowana na interfejs API na poziomie 13 lub wyższym (zgodnie z zadeklarowanymi atrybutami minSdkVersion i targetSdkVersion), należy również zadeklarować konfigurację „screenSize”, ponieważ zmienia się również, gdy urządzenie przełącza się między orientacją pionową a poziomą.

Ponadto, jeśli wszystkie zawierają wartość keyboardHiddenw swoich przykładach, nie powinien wtedy również rozważyć locale, mcc, fontScale, keyboardi inni? ..

Martynas
źródło
3

Miałem tę linię w moim AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Które zmieniłem na (właśnie dodałem android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

To naprawiło dla mnie rzeczy.

Ian Jamieson
źródło
2

Coś do uzupełnienia: niedawno zaktualizowałem aplikację, poprzednia działała zarówno w trybie poziomym, jak i pionowym, i chcę, aby zaktualizowana wersja działała w trybie pionowym, więc dodałem

android:screenOrientation="portrait"

do odpowiedniej aktywności i po prostu zawiesił się, gdy testowałem aktualizację. Potem dodałem

android:configChanges="orientation|keyboardHidden"

też i działa.

użytkownik 2819453
źródło
1
Jeśli nie jest to odpowiedź na pytanie, może być dodanie go jako komentarza.
JPReddy
Sprawdź, czy dodałeś go do działania nie dla bloku aplikacji
Waran
1

Myślę, że chcesz dodać android:configChanges="orientation|keyboardHidden"do swojej działalności? W przeciwnym razie działanie zostanie ponownie uruchomione po zmianie konfiguracji. Nie onConfigurationChangedbędzie się wtedy nazywać, tylkoonCreate

Nanne
źródło
1

Jeśli chcesz obsługiwać różne orientacje debugi releasekompilacje, napisz to (patrz https://developer.android.com/studio/build/gradle-tips#share-properties-w-the-manifest ).

W build.gradleswoim appfolderze napisz:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Następnie AndroidManifestmożesz użyć tej zmiennej „orientacja” w dowolnym Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Możesz dodać android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]w debugowaniu i manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]wydaniu,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />
CoolMind
źródło
-8

Krótka odpowiedź: nie rób tego.

Przeprojektuj aplikację, aby działała zarówno w trybie pionowym, jak i poziomym. Nie ma czegoś takiego jak interfejs użytkownika, którego nie można zaprojektować do pracy zarówno w pionie, jak iw krajobrazie; tylko leniwi lub pozbawieni wyobraźni programiści.

Powód jest raczej prosty. Chcesz, aby Twoja aplikacja była dostępna dla jak największej liczby odbiorców na jak największej liczbie różnych urządzeń. Wymuszając określoną orientację ekranu, uniemożliwiasz uruchamianie aplikacji (zwykle) na urządzeniach, które nie obsługują tej orientacji, i denerwujesz i wyobcujesz potencjalnych klientów, którzy wolą inną orientację.

Przykład: Projektujesz aplikację tak, aby wymuszać tryb portretowy. Klient pobiera aplikację na urządzenie 2 w 1, z którego korzysta głównie w trybie poziomym.
Konsekwencja 1: Twoja aplikacja jest bezużyteczna lub klient jest zmuszony oddokować swoje urządzenie, obrócić je i używać w orientacji, która nie jest dla nich znana ani wygodna.
Konsekwencja 2: Klient jest sfrustrowany nieintuicyjnym wyglądem Twojej aplikacji i znajduje alternatywę lub całkowicie ją zrzuca.

Walczę z tym teraz za pomocą aplikacji i jako konsument i programista nienawidzę tego. Choć aplikacja jest tak przydatna, jak fantastyczne są jej funkcje, absolutnie jej nie znoszę, ponieważ zmusza mnie do korzystania z orientacji przeciwnej do wszystkich innych sposobów korzystania z mojego urządzenia.

Nie chcesz, aby Twoi klienci nienawidzili Twojej aplikacji.


Wiem, że to nie odpowiada bezpośrednio na pytanie, więc chcę wyjaśnić to bardziej szczegółowo tym, którzy są ciekawi.

Deweloperzy mają tendencję do naprawdę dobrego pisania kodu i okropnego projektowania. To pytanie, choć brzmi jak pytanie kodowe, a pytający z pewnością czuje się jak pytanie kodowe, jest naprawdę pytaniem projektowym.

Pytanie naprawdę brzmi: „Czy powinienem zablokować orientację ekranu w mojej aplikacji?” Pytający zdecydował się zaprojektować interfejs, aby działał i wyglądał dobrze tylko w trybie portretowym. Podejrzewam, że miało to na celu zaoszczędzenie czasu programistycznego lub ponieważ przepływ pracy aplikacji szczególnie sprzyja układowi portretowemu (typowemu dla gier mobilnych). Ale te powody pomijają wszystkie naprawdę ważne czynniki, które motywują właściwy projekt.

  1. Zaangażowanie klientów - chcesz, aby klienci czuli się wciągnięci w Twoją aplikację, a nie wypychani z niej. Aplikacja powinna płynnie przechodzić z tego, co robił klient przed jej otwarciem. (To jest powód, dla którego większość platform ma spójne zasady projektowania, więc większość aplikacji wygląda mniej więcej tak samo, choć nie muszą).

  2. Reakcja klienta - chcesz, aby Twoi klienci pozytywnie reagowali na Twoją aplikację. Powinny z tego korzystać. Nawet jeśli jest to aplikacja płacowa do pracy, powinna być dla nich przyjemnością, aby ją otworzyć i zarejestrować. Aplikacja powinna oszczędzać klientom czas i redukować frustrację związaną z alternatywami. (Aplikacje, które denerwują użytkowników, budzą niechęć do Twojej aplikacji, która przeradza się w niechęć do Twojej marki).

  3. Konwersja klientów - chcesz, aby Twoi klienci mogli szybko i łatwo przejść od przeglądania do interakcji. Jest to ostateczny cel każdej aplikacji, aby zamienić wyświetlenia na przychody. (Aplikacje, które nie generują przychodów, to strata czasu na budowanie z perspektywy biznesowej).

Źle zaprojektowany interfejs użytkownika zmniejsza zaangażowanie i reakcję klientów, co ostatecznie przekłada się na niższe przychody. W świecie zorientowanym na urządzenia mobilne (a zwłaszcza na temat trybów wyświetlania w orientacji pionowej / poziomej) wyjaśnia to, dlaczego projektowanie stron internetowych jest tak ważne. Walmart Canada wprowadził responsive design na swojej stronie internetowej w listopadzie 2013 roku i odnotował 20% wzrost konwersji klientów. O'Neill Clothing wdrożyło elastyczne projektowanie stron internetowych i przychody od klientów korzystających z urządzeń iOS wzrosły o 101,25% , a 591,42% od klientów korzystających z urządzeń z Androidem .

Deweloperzy mają również tendencję do skupiania się na wdrażaniu określonego rozwiązania (takiego jak blokowanie orientacji wyświetlania), a większość programistów na tej stronie z przyjemnością pomoże wdrożyć to rozwiązanie, nie zastanawiając się, czy jest to nawet najlepsze Rozwiązaniem problemu.

Zablokowanie orientacji ekranu jest równoważne z projektem interfejsu użytkownika implementującym pętlę „do-while”. Czy jesteś naprawdę pewien, że chcesz zrobić to w ten sposób, czy istnieje lepsza alternatywa?

Nie zmuszaj aplikacji do przejścia w tryb pojedynczego wyświetlania. Zainwestuj dodatkowy czas i wysiłek, aby szybko reagować.

Tomasz
źródło
2
Rozumiem i zgadzam się z tym, że jest to źle zaprojektowany interfejs użytkownika. Ale to nie zmienia faktu, że MUSISZ to zrobić, a mimo to ramy powinny mieć te możliwości. Nigdy nie wiesz, jakie będą przyszłe aplikacje i co musisz zrobić, więc pytanie jest nadal aktualne.
Z. Khullah
1
Nie mylisz się Myślę, że moja odpowiedź była częściowo napędzana frustracją, którą mam z kilkoma aplikacjami, które robią to niepotrzebnie i całkowicie rujnuje to doświadczenie. Powiem, że liczba uzasadnionych przypadków blokowania trybu wyświetlania jest nieskończenie mała (i wciąż możliwa do wykonania i preferowana, po prostu poza budżetem). To przywodzi na myśl inne problemy; kodowanie staje się tak łatwe, jak to możliwe, ponieważ wielu programistów-amatorów pisze aplikacje, ponieważ znają kod, ale nie uczą się, jak korzystać z interfejsu użytkownika lub projektowania, ani nawet podstawowych dobrych praktyk (aplikacje Java instalowane w \ AppData - EWWWW).
Thomas
1
Tworzę aplikację VR. Orientacja MUSI BYĆ pozioma, aby okulary mogły wykonywać swoją magię. To jeden przykład interfejsu użytkownika, którego nie można zaprojektować do pracy zarówno w pionie, jak iw poziomie. Gry mogą także wymuszać określoną orientację. Założę się, że istnieje mnóstwo uzasadnionych przypadków.
Raslanove
1
Chociaż StackExchange istnieje, aby odpowiedzieć na określone pytania, odpowiedzi należy napisać, aby zastosować je tak ogólnie, jak to możliwe, aby te odpowiedzi były przydatne dla innych. Programowanie to znacznie więcej niż pisanie kodu, a powodem, dla którego istnieje tak wiele niepotrzebnych aplikacji na świecie, jest to, że tak wielu programistów zapomina - lub nigdy się nie uczy - ważną zasadę. Osobiście dodałbym, że jeśli robisz VR na telefonie, robisz VR źle - ale koszt spowodował popyt na VR na platformy, które nigdy nie powinny go obsługiwać.
Thomas
1
Nie zgadzam się z tą odpowiedzią, ale jest to odpowiedź na pytanie, które nie zostało zadane.
przejazd