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.

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.


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.


@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);

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"] >  

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

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"/>

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"

5

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

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

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.


3

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


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.


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.


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


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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.