Android etkinliğini her zaman yatay mod kullanmaya zorlar


144

HTC G1 cihazımda Android VNC görüntüleyicisini kullanıyorum . Ancak bazı nedenlerden dolayı, G1'im portre modunda olmasına rağmen bu uygulama her zaman manzara modunda. Android VNC görüntüleyici açık kaynak olduğundan, bir etkinliğin 'manzara' olmasının nasıl mümkün olduğunu bilmek istiyorum. Telefonun yönüne göre değiştirmek istiyorum.

Yanıtlar:


188

9. satırdaki AndroidManifest.xml'ye ( bağlantı ) bakın:

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

Bu satır screenOrientation, yatay olarak belirlenir , ancak yazar, ekran yönlendirme değişikliklerini geçersiz kılmaya devam eder configChanges="orientation|keyboardHidden". Bu, VncCanvasActivity.java'da geçersiz kılınmış bir işleve işaret eder.

VncCanvasActivity'ye bakarsanız, 109 numaralı satır geçersiz kılınan işlevdir:

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

Yazar, özellikle klavye veya yön değişikliklerini yok saymak için bir yorum yaptı.


Bunu değiştirmek isterseniz, yukarıda gösterilen AndroidManifest.xml dosyasına geri dönebilir ve satırı şu şekilde değiştirebilirsiniz:

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

Bu, kullanıcı cihazı döndürdüğünde programı dikeyden yataya geçecek şekilde değiştirmelidir.

Bu işe yarayabilir, ancak düzenin nasıl oluşturulduğuna bağlı olarak GUI'nin görünümünü bozabilir. Bunu hesaba katmanız gerekecek. Ayrıca, etkinliklerin nasıl kodlandığına bağlı olarak, ekran yönü değiştirildiğinde, herhangi bir giriş kutusuna doldurulan değerlerin kaybolduğunu fark edebilirsiniz. Bunun da ele alınması gerekebilir.


3
configChangesÖzellik tam olarak neden gereklidir? Klavyesiz telefonumda onsuz çalışıyor gibi görünüyor ... Eğer screenOrientation="landscape"atlar, ancak atlarsanız yönlendirme hangi durumlarda portre olarak değişecektir configChanges?
Timmmm


sistem görüntüsü seçme kitaplığı gibi yerleşik bir etkinliği yalnızca yatay veya yalnızca dikey olarak nasıl zorlarsınız?
Jacky

118

Aynı verileri java kodunuzda da ayarlayabilirsiniz.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo üzerindeki diğer değerler, sensörü geri veya kilitli resme geri ayarlamanızı sağlar. Şahsen, bu soruya başka bir cevapta önerildiği gibi Manifest'teki bir şeye ayarlamayı ve daha sonra bir ihtiyaç varsa Android SDK'daki yukarıdaki çağrıyı kullanarak değiştirmeyi seviyorum.


@Yegor Her zaman değil. Android belgelerinden: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

Benim OnCreate(Bundle), genellikle aşağıdakileri yaparım:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
diğer cevaplardaki manifest metodu işe yaramadı ama @anwarma seninki yaptı
Anup

31

Manifestteki bir etkinliğin yönünü belirtebilirsiniz. Buraya bakın .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

Manifest'te:

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

Faaliyetinizde:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

Manzara modunda tüm etkinliği görüntülemek için kullandığım kod aşağıdadır:

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

2
"oryantasyon" Uygulamanız API seviye 13 veya üzerini hedefliyorsa, "screenSize" de bildirmelisiniz
Mina Fawzy

7

AndroidManifest.xml dosyası için hızlı ve basit bir çözümdür, yatay moda zorlamak istediğiniz her etkinlik için aşağıdakileri ekleyin:

android:screenOrientation="landscape"

5

Bu Xamarin.Android için çalışıyor. OnCreate () içinde

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

4

Bu kadar!! Bu düzeltmeyi uzun zamandır bekliyorum.

Yatay mod gerektiren (programlı olarak) bir etkinliği iki kez başlatma hakkında eski bir Android sorunum var: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Şimdi Android başlangıçta Manzara modunu yapıyor.


3

Arslan, neden yönelimi yanlısı bir şekilde zorlamak istiyorsun? <activity android:name=".youractivityName" android:screenOrientation="portrait" />


Ben asker değilim, ama belli bir zamanda zorlamak istediği için belki de programlı olarak zorlamak ister?
Hamzah Malik

1

Kodda yapmak IMO yanlış ve daha da onCreate içine koymak eğer. Manifest'te yapın ve "sistem" uygulamanın başlangıcından itibaren yönlendirmeyi bilir. Ve bu tip meta veya üst düzey "rehberlik" manifestte OLMALIDIR. Kendinizin bunu kanıtlamak istiyorsanız, Aktivitenin onCreate'inde bir mola verin. Kodda yaparsanız, iki kez çağrılacaktır: Dikey modda başlar ve sonra Yatay olarak değiştirilir. Manifest'te yaparsanız bu olmaz.


1
Katılmıyorum. Manifestle aksine kodda herhangi bir şey yapmak her zaman benim tercih ettiğim yöntemdir. Tek sorumluluk ilkesine dayanarak, bildirim yalnızca uygulama düzeyi özellikleri, izinleri ve API bağlamaları ile ilgilenmelidir. Aslında <activity> etiketinin bir uygulama bildiriminde mevcut olmasına katılmıyorum ve bu yüzden asla oraya koymadım (ve iyi çalışıyor). Bir etkinliğin nasıl sunulduğu açık bir şekilde sunum konusudur. Etkinliğinizin nasıl sunulduğundan tamamen sorumlu olması gerekir ve bu nedenle genellikle tüm sunum mantığını görünüm / etkinlik koduna koyarım.
Ağustos'ta

0

İçin Android 4.0 (Ice Cream Sandwich) ve daha sonra, ben yanında bu eklemek için gerekli landscapedeğeri.

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

Yalnızca kullanılması keyboardHidden|orientation, güç düğmesine basıldığında bellek sızıntılarına ve etkinliklerimin yeniden oluşturulmasına neden olur.


Kötü uygulama uyarısı! Bunun, etkinliği manzara modunda zorlamakla ilgisi yoktur. Her zaman faaliyet durumunuzun depolanmasını ve rekreasyonunu uygulamanız gerekir. Bu temel Android Geliştirme bilgisidir. Bu hacky düzeltme ile çözmeyin. Daha fazla belleğe ihtiyaç duyması durumunda etkinlik her zaman sistem tarafından kapatılabilir.
Roel

@Roel, örneğin cihazı döndürdüğünüzde etkinliğin resme dönmesini önlemenin tek yolu budur. Bu yapılandırmaların etkinliği etkilemesini önler.
Peterdk

Biraz huysuz mesaj için özür dilerim, ama test ettim ve manzara modu için tüm bu değerleri kullanmıyorum. Tüm bu değerleri eklediğinizde, etkinliğin yeni başlatılması (ve bunu uygulamanız gerekir!) Yerine onConfigurationChanged () öğesinde değişiklikleri kendiniz işlediğiniz anlamına gelir, ancak landschape zorlarsanız bir dönüş gerçekleşmez.
Roel

Merhaba, bazıları gerekli olmayabilir, ancak hepsini atlamak garip rotasyon sorunlarına neden olacaktır. Şimdi test edemiyorum, ancak her zaman manzarada olması gereken bir uygulama geliştirirken, sadece kullanmak orientation|screensizeher durumda yeterli değildi. Otomatik olarak portreye dönecektir.
Peterdk

Bu yapılandırmalar Google Mobil Reklamlarda ve diğer Reklam SDK'larında da kullanılır. O zaman onları buradan aldım.
Peterdk

0

SetLayout yöntemini böyle çağırmadan önce onCreate yönteminizde ActivityInfo (android.content.pm.ActivityInfo) kullanın

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

0

Sadece
android kullan: screenOrientation = "portre" araçları: ignore = "LockedOrientationActivity"


0

Aktiviteye Aşağıdaki Satırları Ekle

Her Etkinliğe girmeniz gerekiyor

manzara için

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

portre için

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

İşte MainActivity Örneği

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

-25

CTRL+F11Ekranı döndürmek için basın .


3
Ekranın nasıl döndürülebileceğini değil, bir uygulamanın varsayılan yönünü nasıl ayarlayacağını şimdi istiyorlar.
kyle k

Öykünücü için CTRL + f12.
Tembel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.