Tüm uygulamayı yalnızca portre modunda nasıl ayarlayabilirim?


201

Uygulamanın yalnızca dikey modda çalışması için nasıl ayarlayabilirim? Uygulama çalışırken manzara modunun devre dışı bırakılmasını istiyorum. Programlı olarak nasıl yaparım?

Yanıtlar:


294

Herhangi bir Android sürümü için

XML'den

android:screenOrientation="portrait"Manifest.xml dosyanızdaki her etkinlik için belirtebilirsiniz . applicationEtikette bu seçeneği belirleyemezsiniz .

Java'dan

Diğer seçenek, programlı olarak, örneğin bir Activitytemel sınıfta yapmaktır :

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Android 4+ için (API 14+)

Son seçenek, yalnızca Android 4.0'dan (API 14+) beri kullanılabilen etkinlik yaşam döngüsü dinleyicileri ile yapmaktır. Her şey özel bir Applicationsınıfta gerçekleşir:

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdaptersadece boş bir uygulama olacak oluşturmak için gereken bir yardımcı sınıftır ActivityLifecycleCallbacks(bu yüzden bunlardan birine ihtiyacınız olduğunda o arayüzün her bir yöntemini geçersiz kılmak zorunda değilsiniz).


1
çalışmıyor. cihazı açtığımda yatay moda dönüyor. ve kodda daha fazla şey bu setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) kullanıyorum; setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); ilerleme çubuğu talimatları. bu talimatlarla ilgili herhangi bir sorun var mı?
naresh

işe yarıyor. bir şey daha kodlama parçanızda iki talimatın üzerine çıkmaz. bu, sensörün ekran yönünü değiştirmesini mümkün kıldığı anlamına gelir.
naresh

3
-1: Asker özellikle // programlı olarak // nasıl yapılacağını sordu ve tüm uygulama için (bu da her aktivite için ayrı ayrı yapmak istemediklerine inanmamı sağlıyor).
jwir3

@ jwir3, katılmıyorum. "programlama" sadece kod kodu yazmakla kalmaz, aynı zamanda kullandığınız tüm meta dosyaları, kaynakları, IDE'nin deyimleri etrafında çalışarak, vb. Bu iyi bir cevaptır, sorunu düzeltir ve OP doğru olarak işaretlenmiştir Görünüşe göre orijinal soru için yeterli bir cevap.
James Webster

9
LifeCycleCallbacks yöntemini kullanarak, cihazınızı yatay modda (normalde ne olur) tuttuğunuzda etkinlik lansmanlarında gecikme yaşarsınız. Sanırım bunun nedeni, cihazların faaliyetler arasında kısaca manzara moduna dönmesi ve bununla başa çıkması için zamana ihtiyaç duyması. Manifest'te yön ayarının bu etkisi yoktur.
İsimsiz

142

Evet bunu hem programlı olarak hem de tüm aktiviteleriniz için tüm aktivitelerinizin genişlettiği bir AbstractActivity yaparak yapabilirsiniz.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Bu soyut etkinlik küresel bir menü için de kullanılabilir.


3
Not: Bunun ActivityInfo.SCREEN_ORIENTATION_NOSENSORdaha iyi bir yanıt olması gerektiğine inanıyorum çünkü bazı cihazların Dikey yönlendirmesi olmadığı için cihazı varsayılan durumda bırakması amaçlanıyor. Ancak, 'nosensor' benim için çalışmıyor, bu yüzden @ arcone'un cevabı benim için.
David Manpearl

106

Bunu tüm uygulamanız için tüm faaliyetlerinizin ortak bir taban sınıfını genişletmesine kalmadan için yapabilirsiniz.

Püf noktası Application, projenize bir alt sınıf eklediğinizden emin olmaktır . Onun içinde onCreate(), uygulama ilk başladığında, bir kayıt denilenActivityLifecycleCallbacks aktivite yaşam döngüsü olayların bildirimlerini almak için nesneyi (API seviyesi 14+).

Bu, uygulamanızdaki herhangi bir etkinlik başlatıldığında (veya durdurulduğunda veya devam ettirildiğinde veya her neyse) kendi kodunuzu yürütme fırsatı verir . Bu noktada setRequestedOrientation()yeni oluşturulan etkinliği arayabilirsiniz .

class MyApp extends Application {

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

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}

9
soruyu ele alan tek cevap budur. Hepsine hükmedecek bir satır.
Samuel

2
* Hepsine hükmedecek bir sınıf.
Jay Mayu

4
ve hiçbir zaman manifest uygulama kökü eklemeyi unutmayın. android: name = ". Uygulamam"
Faisal Naseer

2
Bu yaklaşım, etkinliğin onCreate () yöntemini iki kez çağırır.
Sandeep R

3
Sorun, cihazı yatay olarak tuttuğunuzda ve yeni etkinlik başlattığınızda, yatay yönde görünür ve sonra dikey olarak döner. Tam uygulamayı dikey yönde kilitlemenin tek iyi yolu, Manifest'teki her etkinliği işaretlemektir.
Den

42

Bunu manifest dosyanızda ayarlayabilirsiniz.

android:name=".your launching activity name"
android:screenOrientation="portrait"

ve sınıf dosyanızdaki kodu aşağıdaki gibi yazarak da elde edebilirsiniz:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh pls eğer ihtiyacınıza göre herhangi bir çözüm varsa ans kabul de
puanınızı yarışacak

24

AndroidManifest.xml'deki etkinliğe android: screenOrientation = "portre" ekleyin. Örneğin:

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

26
UYGULAMA'nın etkinlik olmadığını söyledi.
Reinherd

10

kullanın:

android:screenOrientation="portrait" 

Bu satırı yalnızca dikey modda göstermek istediğiniz her etkinlikte uygulamanızın manifest dosyasına yazmanız yeterlidir.


8

Her etkinlik için manifest dosyanıza yazın:

android:screenOrientation="portrait" 

2

Android geliştirici kılavuzundan:

"yön" Ekran yönü değişti - kullanıcı cihazı döndürdü. Not: 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.

"screenSize" Mevcut ekran boyutu değişti. Bu, geçerli en boy oranına göre şu anda kullanılabilir boyutta bir değişikliği temsil eder, bu nedenle kullanıcı yatay ve dikey arasında geçiş yaptığında değişir. Ancak, uygulamanız API düzey 12 veya daha düşük bir sürümü hedefliyorsa, etkinliğiniz her zaman bu yapılandırma değişikliğini kendisi yapar (bu yapılandırma değişikliği, bir Android 3.2 veya daha yüksek cihazda çalışırken bile etkinliğinizi yeniden başlatmaz). API seviye 13'te eklendi.

Yani, AndroidManifest.xml dosyasına şunu koyabiliriz:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 

1

Altına <preference name="orientation" value="portrait" />ekleniyor<widget> benim Config.xml benim için çalıştı içinde.

(Ya cihazımda çalışmadı, bina sırasında üzerine yazıldı veya oluşturma işlemi sırasında kullanımdan kaldırma hataları verdi.)


Bahsedilen config.xml nerede? Hangi geliştirme platformundan bahsediyorsunuz?
Tash Pemhiwa

1

Manifest dosyasında "dikey" de kullanmak istediğiniz etkinliği bu kodu Etkinlik etiketine yazmalısınız

  android:screenOrientation="portrait" 

bunun gibi

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

ama yatay ekran istiyorsanız u bu kodu bu gibi kullanın

android:screenOrientation="landscape"

1

Merak eden biri varsa, bunu tüm faaliyetleriniz için Kotlin'de ortak bir temel sınıf genişletmek zorunda kalmadan tüm uygulamanız için nasıl yapabilirsiniz , aşağıdaki örneğe bakın:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

ve sonra AndroidManifest'te ortak temel sınıfınızı şu şekilde eklemelisiniz:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"

1
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}

0

Bunu iki şekilde yapabilirsiniz.

  1. Ekle android:screenOrientation="portrait"Manifest dosyanızı ilgili etkinliğe
  2. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); `OnCreate () yöntemindeki etkinliğinize ekleyin

0

Graham Borland'ın cevabına benzer ... ancak istemiyorsanız Uygulama sınıfı oluşturmak zorunda değilsiniz ... sadece projenizde bir Temel Etkinlik oluşturun

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

Ve Potrait Modunu kullanmak istediğiniz AppCompatActivity yerine bu sınıfı genişletin

public class your_activity extends BaseActivity {}

0

Xamarin Kullanıcıları için:

Tüm etkinliklerinizi bir BaseActivityJust eklentisine genişletirseniz :

this.RequestedOrientation = ScreenOrientation.Portrait;

Bu sorunu çözecektir. Belirli bir etkinliğin yatay olmasını istiyorsanız, bunu geçersiz kılın OnActivityCreated. Gibi:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

Bildirinizde şunu yazın:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
Bu, 3 yaşındaki cevapların henüz söylemediği yeni bir şey eklemiyor. Silmeyi düşünebilirsiniz. Cevabınızı diğerlerinden ayıran daha fazla bilgi içerecek şekilde düzenlemeye karar verirseniz, lütfen @reply me me.
Artjom B.

1
android: screenOrientation = "portre" uygulama etiketine eklenemez, etkinlik etiketi içine girmelidir
Hossein Amini
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.