"Dikey" yönlendirme modunu zorla


298

Uygulamam kesinlikle "manzara" modu için tasarlanmadığından, uygulamam için "portre" modunu zorlamaya çalışıyorum.

Bazı forumları okuduktan sonra manifest dosyama şu satırları ekledim:

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

Ancak cihazımda çalışmıyor (HTC Desire). Manifest dosyasındaki satırları yoksayarak "dikey" yatay "manzaradan geçer.

Daha fazla forum okuduktan sonra, manifest dosyama eklemeye çalıştım:

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

ve etkinlik sınıfımdaki bu işlev:

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

Ama yine, şans yok.

Yanıtlar:


531

Yönü uygulama öğesine uygulamayın , bunun yerine niteliği etkinlik öğesine uygulamalısınız ve ayrıca configChangesaşağıda belirtildiği gibi ayarlamanız gerekir .

Misal:

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

Bu bildirim dosyasında uygulanır AndroidManifest.xml.


26
ConfigChanges ne için?
12'de Dror

71
@Orchestrator, configChanges, yapılandırma değişikliğinin etkinliğin kendisi tarafından gerçekleştirildiği anlamına gelir. Bu olmadan, bir yönlendirme değişikliği varsa etkinlik yeniden başlatılır. Yönün "portre" olduğunu belirttiyseniz, nasıl değişeceğini sorabilirsiniz. Yönü değiştiren başka bir etkinlik başlatırsanız, yeni etkinlikten çıkıp sizi etkinliğinize geri döndürürseniz değişebilir. Örneğin, Samsung Galaxy S3'teki varsayılan görüntü yakalama amacı bunu belirli yönlerde yapar.
Gordon McCreight

2
@GordonMcCreight, Bunu gerçek bir örnekle açıklayabilir misiniz "Yönlendirmenin" portre "olduğunu belirttiyseniz, nasıl değişeceğini sorabilir misiniz? Yönlendirmeyi değiştiren başka bir etkinlik başlatırsanız değişebilir. yeni etkinlikten çıkıp sizi etkinliğinize geri döndürür. "
Tushar Pandey

3
Elbette, @TusharPandey. Doğru hatırlarsam, bunun kedere yol açtığı yer, faaliyetimizin Samsung Galaxy S3'te varsayılan görüntü yakalama amacını başlatmasıydı. Temel olarak, sadece bir fotoğraf çekmek ve sonuçları almak istedik. Bununla birlikte, kamera amacı geri döndüğünde, etkinliğimizdeki durumu ortadan kaldıran bir yönelim değişikliğine neden oldu, çünkü buna karşı korumamız gerektiğine inanmadık (tüm uygulamamızın yalnızca "portre" yönünde olduğu göz önüne alındığında). Galaxy S3'ün bunu nasıl ve neden yaptığı (kuşkusuz sınırlı) anlayışımın ötesinde.
Gordon McCreight

8
"KeyboardHidden" neden dahil edilmiştir?
gonzobrainler

24

Bunu not et

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

etkinliğin tanımlandığı manifest dosyasına eklenir.


13

Bence android:screenOrientation="portrait"bireysel aktiviteler için kullanılabilir. Bu <activity>etiketi şu şekilde kullanın :

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>

13

Benimki gibi çok fazla etkinliğiniz varsa, başvurunuzda Veya manifest'teki her bir etkinlik etiketi için kodu girmek istemiyorsanız bunu yapabilirsiniz.

Application Base sınıfınızda bir yaşam döngüsü geri çağrısı alırsınız

yani temelde her aktivite için ne olur burada Uygulama Sınıfı üzerinde oluşturma oluştururken tetiklenir kodu ..

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

            }
        });
}

Umarım bu yardımcı olur.


1
Verimli cevap! bu, özellikle çok sayıda Etkinliğe bağlı olan karmaşık uygulamalar geliştirenler için doğru cevap olmalıdır.
FEBRYAN ASA PERDANA

10

Set kuvvet Dikey veya Yatay modu sırasıyla satırları ekleyin.

Satırın altına aktar :

import android.content.pm.ActivityInfo;

Hemen üstüne aşağıdaki satırı ekle setContentView(R.layout.activity_main);

İçin Dikey :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

İçin Landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Bu kesinlikle işe yarayacak.


1
Bu, bazı cihazlarda Android 9 ile başarısız oluyor - sadece PORTRAIT kullansanız bile ekran döndürme geçişi kısa bir süre için görülebilir
Igor Wojda

Mümkünse bununla karşılaştığınız cihaz bilgilerini belirtebilir misiniz?
Parth Patel

4

Android'in belgelerine göre, genellikle screenSizeolası bir yapılandırma değişikliği olarak da eklemelisiniz .

android:configChanges="orientation|screenSize"

Uygulamanız API seviyesi 13 veya üzerini (minSdkVersion ve targetSdkVersion öznitelikleri tarafından bildirildiği gibi) hedefliyorsa, bir aygıt dikey ve yatay yönler arasında geçiş yaptığında da değiştiğinden, "screenSize" yapılandırmasını da bildirmeniz gerekir.

Tüm değerini dahil Ayrıca, keyboardHiddensizin örneklerde, daha sonra da dikkate almamalıdır locale, mcc, fontScale, keyboardve diğerleri? ..


3

AndroidManifest.xml dosyamda bu satır vardı

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

Hangisi olarak değiştirdim (yeni ekledim 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">

Bu benim için işleri düzeltti.


2

Tamamlayıcı bir şey: Son zamanlarda bir uygulamayı güncelledim, önceki hem yatay hem de dikey modda çalışıyordu ve güncellenmiş sürümün dikey modda çalışmasını istiyorum, bu yüzden ekledim

android:screenOrientation="portrait"

ilgili etkinliğe ve güncellemeyi test ettiğimde çöktü. Sonra ekledim

android:configChanges="orientation|keyboardHidden"

ve işe yarıyor.


1
Bu soru için bir cevap değilse, yorum yardımcı olacağından soruyu eklemek olabilir.
JPReddy

Uygulama bloğu için olmayan etkinliğe eklediğinizi kontrol edin
Waran-

1

Sanırım android:configChanges="orientation|keyboardHidden"aktivitene eklemek mi istiyorsun ? Aksi takdirde etkinlik config-change üzerinde yeniden başlatılır. O onConfigurationChangedzaman çağrılmaz, sadeceonCreate


1

Farklı yapıları debugve releaseyapıları desteklemek istiyorsanız , bunu yazın (bkz. Https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

In build.gradlesenin içinde appklasör yazma:

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

Sonra AndroidManifestbu değişken "yönlendirme" herhangi birinde kullanabilirsiniz Activity:

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

Ekleyebilirsin android:configChanges :

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]hata ayıklama ve manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]serbest bırakma,

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

-8

Kısa cevap: Yapma.

Uygulamanızı hem dikey hem de yatay modda çalışacak şekilde yeniden tasarlayın. Hem portre hem de manzarada çalışmak üzere tasarlanamayacak bir kullanıcı arayüzü diye bir şey yoktur; sadece tembel veya yaratıcı olmayan geliştiriciler.

Nedeni oldukça basit. Uygulamanızın mümkün olduğunca çok farklı cihazda mümkün olduğunca geniş bir kitle tarafından kullanılabilir olmasını istiyorsunuz. Belirli bir ekran yönlendirmesini zorlayarak, uygulamanızın bu yönlendirmeyi desteklemeyen cihazlarda (kullanılabilir şekilde) çalışmasını engeller ve farklı bir yönlendirmeyi tercih eden potansiyel müşterileri hayal kırıklığına uğratır ve yabancılaştırırsınız.

Örnek: Uygulamanızı portre modunu zorlayacak şekilde tasarlıyorsunuz. Bir müşteri uygulamayı ağırlıklı olarak yatay modda kullandıkları 2'si 1 arada bir cihaza indirir.
Sonuç 1: Uygulamanız kullanılamıyor veya müşteriniz cihazını çıkarmak, döndürmek ve tanıdık veya rahat olmayan bir yönde kullanmak zorunda kalıyor.
Sonuç 2: Müşteri, uygulamanızın sezgisel olmayan tasarımı nedeniyle hayal kırıklığına uğrar ve bir alternatif bulur veya uygulamayı tamamen terk eder.

Şu anda bir uygulama ile bununla mücadele ediyorum ve bir tüketici ve geliştirici olarak bundan nefret ediyorum. Uygulama kadar kullanışlı, sunduğu özellikler kadar fantastik, ben kesinlikle nefret ediyorum çünkü cihazımı kullandığım diğer her şekilde karşıt bir yönlendirme kullanmaya zorlar.

Müşterilerinizin uygulamanızdan nefret etmesini istemezsiniz.


Bunun soruyu doğrudan cevaplamadığını biliyorum, bu yüzden meraklı olanlar için biraz daha ayrıntılı olarak açıklamak istiyorum.

Geliştiricilerin kod yazmada gerçekten iyi ve tasarımda gerçekten korkunç olma eğilimi vardır. Bu soru, bir kod sorusu gibi görünse de ve asker kesinlikle bir kod sorusu gibi hissetse de, gerçekten bir tasarım sorusudur.

Soru gerçekten "Uygulamamda ekran yönünü kilitlemeli miyim?" Asker, UI'yi sadece portre modunda çalışacak ve iyi görünecek şekilde tasarlamayı seçti. Geliştirme süresinden tasarruf etmek veya uygulamanın iş akışının portre düzenine (mobil oyunlar için ortak) özellikle elverişli olması nedeniyle şüpheleniyorum. Ancak bu nedenler, doğru tasarımı motive eden tüm önemli faktörleri ihmal eder.

  1. Müşteri etkileşimi - müşterilerinizin uygulamanızın içine çekilmediğini hissetmesini istersiniz. Uygulama, uygulamanızı açmadan önce müşterinizin yaptığı her şeyden sorunsuz bir şekilde geçmelidir. (Çoğu platformun tutarlı tasarım ilkelerine sahip olmasının nedeni budur, bu nedenle çoğu uygulama gerekmeksizin az çok benzer görünür.)

  2. Müşteri yanıtı - müşterilerinizin uygulamanıza olumlu tepki vermesini istiyorsunuz. Bunu kullanmaktan zevk almalılar. İş için bir bordro uygulaması olsa bile, onları açmak ve saat açmak için bir zevk olmalı. Uygulama, müşterilerinize zaman kazandırmalı ve alternatifler üzerindeki hayal kırıklığını azaltmalıdır. (Kullanıcıları rahatsız eden uygulamalar uygulamanıza karşı kızgınlık oluşturur ve bu da markanıza karşı kızgınlığa dönüşür.)

  3. Müşteri dönüşümü - müşterilerinizin taramadan etkileşime geçmesini hızlı ve kolay bir şekilde yapabilmelerini istiyorsunuz. Gösterimleri gelire dönüştürmek için herhangi bir uygulamanın nihai hedefi budur. (Gelir sağlamayan uygulamalar, işletme perspektifinden oluşturma sürenizin kaybıdır.)

Kötü tasarlanmış bir kullanıcı arayüzü, sonuçta daha düşük gelirle sonuçlanan müşteri katılımını ve yanıtını azaltır. Mobil merkezli bir dünyada (ve özellikle portre / manzara görüntüleme modları konusunda), bu, duyarlı web tasarımının neden bu kadar önemli olduğunu açıklar. Walmart Kanada, Kasım 2013'te web sitelerine duyarlı tasarım getirdi ve müşteri dönüşümünde % 20 artış gördü . O'Neill Giyim duyarlı web tasarımı ve uygulanan iOS cihazları kullanan müşterilerden gelen gelir artışı 101,25% ve 591,42% Android cihazları kullanan müşterilerden gelen .

Ayrıca geliştiricilerin belirli bir çözümü (ekran yönünü kilitleme gibi) uygulamaya odaklanma eğilimi vardır ve bu sitedeki geliştiricilerin çoğu, bunun en iyisi olup olmadığını sorgulamadan bu çözümü uygulamaya yardımcı olmaktan çok memnun olacaktır. problemin çözümü.

Ekran yönünüzü kilitlemek, bir do-while döngüsü uygulamanın UI tasarım eşdeğeridir. Bu şekilde yapmak istediğinizden gerçekten emin misiniz, yoksa daha iyi bir alternatif var mı?

Uygulamanızı tek bir görüntüleme moduna zorlamayın. Duyarlı hale getirmek için fazladan zaman ve çaba harcayın.


2
Bunun kötü tasarlanmış bir kullanıcı arayüzü olduğunu anlıyorum ve kabul ediyorum. Ancak bu, GEREKLİ OLABİLECEĞİNİZ gerçeğini değiştirmez ve yine de çerçevenin genel olarak bu yeteneklere sahip olması gerekir. Gelecekteki uygulamaların nasıl olacağını ve yapmanız gerekeceğini asla bilemezsiniz, bu nedenle soru hala geçerlidir.
Z. Khullah

1
Hatalı değilsin. Cevabımın kısmen gereksiz yere bunu yapan birkaç uygulama ile yaşadığım hayal kırıklığı ile beslendiğini düşünüyorum ve bu deneyimi tamamen mahvediyor. Ekran modunu kilitlemek için yasal vakaların sayısının son derece az olduğunu söyleyeceğim (ve yine de yapılabilir ve tercih edilebilir, sadece bütçe dahilinde değil). Bu diğer sorunları akla getiriyor; kodlama sahip olduğu kadar kolay hale gelirken, kod geliştiren ancak UI veya tasarımın nasıl yapılacağını veya temel en iyi uygulamaları (\ AppData - EWWWW) yükleyen Java uygulamaları bilmeden, uygulama yazan birçok amatör geliştirici vardır.
Thomas

1
Bir VR uygulaması oluşturuyorum. Gözlüklerin sihrini yapması için yönelim manzara OLMALIDIR. Bu, hem portre hem de manzarada çalışmak üzere tasarlanamayan bir kullanıcı arayüzüne bir örnektir. Oyunların da belirli bir yönelimi zorlaması gerekebilir. Eminim tonlarca meşru dava vardır.
Raslanove

1
StackExchange belirli soruları cevaplamak için mevcut olsa da, cevapların diğerlerine faydalı olması için genellikle olabildiğince uygulanacak cevaplar yazılmalıdır . Gelişim sadece kod yazmaktan çok daha fazlasıdır ve dünyada bu kadar çok gereksiz uygulamanın olmasının nedeni, pek çok geliştiricinin bu önemli prensibi unutması ya da asla öğrenmemesidir. Kişisel olarak, bir telefonda VR yapıyorsanız, VR'yi yanlış yaptığınızı - ancak maliyetin VR'ye olan talebi hiç desteklememesi gereken platformlara ittiğini ekliyorum.
Thomas

1
Bu cevaba katılmıyorum ama sorulmamış bir soruyu cevaplıyor.
bmovement
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.