Wymuś działanie Androida, aby zawsze korzystało z trybu poziomego

144

Używam przeglądarki Android VNC na moim HTC G1 . Ale z jakiegoś powodu ta aplikacja jest zawsze w trybie poziomym, mimo że mój G1 jest w trybie portretowym. Ponieważ przeglądarka Android VNC jest open source, chciałbym wiedzieć, w jaki sposób można zakodować działanie jako „krajobrazowe”. Chciałbym to zmienić, aby zachować orientację telefonu.

hap497
źródło

Odpowiedzi:

188

Patrząc na AndroidManifest.xml ( link ), w linii 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Ta linia określa screenOrientationjako poziomą, ale autor idzie dalej w nadpisywaniu wszelkich zmian orientacji ekranu za pomocą configChanges="orientation|keyboardHidden". Wskazuje to na nadpisaną funkcję w VncCanvasActivity.java.

Jeśli spojrzysz na VncCanvasActivity, w linii 109 jest nadpisana funkcja:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

Autor specjalnie umieścił komentarz, aby zignorować wszelkie zmiany klawiatury lub orientacji.


Jeśli chcesz to zmienić, możesz wrócić do pliku AndroidManifest.xml pokazanego powyżej i zmienić wiersz na:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Powinno to zmienić program tak, aby przełączał się z trybu pionowego na poziomy, gdy użytkownik obraca urządzenie.

Może to działać, ale może zepsuć wygląd GUI, w zależności od tego, jak utworzono układ. Będziesz musiał to uwzględnić. Ponadto, w zależności od sposobu kodowania działań, można zauważyć, że po zmianie orientacji ekranu wartości, które zostały wprowadzone w dowolnych polach wejściowych, znikają. To również może wymagać załatwienia.

Pulkit Sethi
źródło
3
Dlaczego dokładnie ten configChangesatrybut jest potrzebny? Wygląda na to, że działa na moim telefonie bez klawiatury bez niego ... W jakich sytuacjach orientacja zmieni się na portret, jeśli masz, screenOrientation="landscape"ale pominiesz configChanges?
Timmmm
jak wymusić wbudowane działanie, takie jak biblioteka wyboru obrazu systemu, tylko w poziomie lub tylko w pionie?
Jacky,
118

Możesz również ustawić te same dane w swoim kodzie java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Inne wartości w ActivityInfo pozwolą ci ustawić go z powrotem na portret sterowany czujnikiem lub zablokowany. Osobiście lubię ustawić to na coś w Manifeście, jak sugerowano w innej odpowiedzi na to pytanie, a następnie zmienić to później, używając powyższego wywołania w Android SDK, jeśli zajdzie taka potrzeba.

haseman
źródło
@Yegor Nie zawsze. Z dokumentów na Androida:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya
40

W moim OnCreate(Bundle)generalnie wykonuję następujące czynności:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
anwarma
źródło
2
metoda manifestu w innych odpowiedziach wydawała się nie działać, ale @anwarma yours
Anup.
31

Możesz określić orientację działania w manifeście. Zobacz tutaj .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  
Michael Krauklis
źródło
24

W manifeście:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

W Twojej działalności:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
avisper
źródło
11

Poniżej znajduje się kod, którego użyłem do wyświetlenia całej aktywności w trybie poziomym:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>
Megha
źródło
2
„Orientacja” Jeśli aplikacja jest przeznaczona dla interfejsu API na poziomie 13 lub wyższym, należy również zadeklarować „screenSize”
Mina Fawzy,
7

Szybkim i prostym rozwiązaniem jest dla pliku AndroidManifest.xml, dodaj następujące informacje dla każdego działania, które chcesz wymusić na trybie poziomym:

android:screenOrientation="landscape"
joshgoldeneagle
źródło
5

Działa to w przypadku platformy Xamarin.Android. W OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Wejdź
źródło
4

Otóż ​​to!! Długo czekałem na tę poprawkę.

Mam stary problem z Androidem dotyczący podwójnego uruchamiania działania, które wymagało (programowo) trybu poziomego: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Teraz Android włącza tryb krajobrazu na starcie.

AndrewDC
źródło
3

Arslanie, dlaczego chcesz wymusić orientację programowo, chociaż jest już sposób na to, by się przekonać <activity android:name=".youractivityName" android:screenOrientation="portrait" />

Niebieski księżyc
źródło
Nie jestem pytającym, ale może chce wymusić programowo, ponieważ chce to wymusić w określonym czasie?
Hamzah Malik
1

Robienie tego w kodzie jest błędem IMO, a tym bardziej, jeśli umieścisz go w onCreate. Zrób to w manifeście, a „system” rozpozna orientację od uruchomienia aplikacji. I tego typu meta lub „wskazówki” najwyższego poziomu POWINNY znajdować się w manifeście. Jeśli chcesz to sobie udowodnić, zrób sobie przerwę w działaniu onCreate. Jeśli zrobisz to w kodzie, zostanie wywołany dwukrotnie: uruchamia się w trybie portretowym, a następnie przełącza się na poziomo. Tak się nie stanie, jeśli zrobisz to w manifeście.

RichieHH
źródło
1
Nie zgadzam się. Robienie czegokolwiek w kodzie, a nie za pośrednictwem manifestu, jest zawsze moją preferowaną metodą. Zgodnie z zasadą pojedynczej odpowiedzialności manifest powinien dotyczyć tylko właściwości na poziomie aplikacji, uprawnień i powiązań API. Właściwie nie zgadzam się z tym, że tag <activity> w ogóle jest obecny w manifeście aplikacji, więc nigdy go tam nie umieszczam (i działa dobrze). Sposób prezentacji działania jest oczywiście problemem prezentacji. Twoja aktywność powinna być wyłącznie odpowiedzialna za to, jak jest prezentowana, dlatego zazwyczaj umieszczam całą logikę prezentacji w kodzie widoku / działania.
Przyjdź
0

W przypadku Androida 4.0 (Ice Cream Sandwich) i nowszych musiałem je dodać, oprócz landscapewartości.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Używanie keyboardHidden|orientationsamego tylko nadal powodowałoby wycieki pamięci i odtwarzanie moich czynności po naciśnięciu przycisku zasilania.

Peterdk
źródło
Ostrzeżenie dotyczące złej praktyki! Nie ma to nic wspólnego z wymuszaniem aktywności w trybie poziomym. Zawsze musisz zaimplementować przechowywanie i odtworzenie stanu swojej działalności. To jest podstawowa wiedza dotycząca programowania na Androida. Nie rozwiązuj tego za pomocą tej hacky. Aktywność może zawsze zostać zamknięta przez system, jeśli potrzebuje więcej pamięci.
Roel
@Roel, cóż, to jedyny sposób, aby zapobiec obróceniu czynności z powrotem do pionu, na przykład, gdy obrócisz urządzenie. Zapobiega to, że te zmiany konfiguracji wpływają na aktywność.
Peterdk
Przepraszam za trochę zrzędliwą wiadomość, ale przetestowałem ją i nie mam wszystkich tych wartości dla trybu krajobrazu. Kiedy dodasz wszystkie te wartości, oznacza to, że sam obsługujesz zmiany w onConfigurationChanged (), a nie, że aktywność jest po prostu restartowana (i musisz to zaimplementować!), Ale jeśli wymusisz obrót w Landschape, nie nastąpi.
Roel
Cześć, niektóre z nich mogą nie być potrzebne, ale pominięcie ich wszystkich spowoduje dziwne problemy z rotacją. Nie mogę teraz testować, ale kiedy tworzyłem aplikację, która musiała być cały czas w krajobrazie, samo używanie orientation|screensizenie było wystarczające we wszystkich przypadkach. Automatycznie powróciłoby do portretu.
Peterdk
Te zmiany konfiguracji są również używane w reklamach mobilnych Google i innych pakietach SDK reklam. Stamtąd je wtedy dostałem.
Peterdk
0

Użyj ActivityInfo (android.content.pm.ActivityInfo) w metodzie onCreate przed wywołaniem metody setLayout, takiej jak ta

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Yamikani Sita
źródło
0

używaj tylko
android: screenOrientation = "portrait" tools: ignore = "LockedOrientationActivity"

Vibhu Vikram Singh
źródło
0

Dodaj następujące wiersze do działania

Musisz wejść w każde działanie

do krajobrazu

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

do portretu

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Tutaj przykład MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Chetan
źródło
-25

Naciśnij, CTRL+F11aby obrócić ekran.

Yann Pascal DEUNGOUE DJOMENI
źródło
3
Chcą teraz, jak ustawić domyślną orientację aplikacji, a nie jak można obrócić ekran.
kyle k
CTRL + f12 dla emulatora.
Lazy