Çalışma zamanında yön nasıl kilitlenir


107

Çalışma sırasında yönlendirmeyi kilitlemenin bir yolu var mı? Örneğin, kullanıcı şu anda yatay durumdaysa ve menü seçeneğine geçiş yapıyorsa, kullanıcının ekranı yatay olarak kilitlemesine izin vermek istiyorum.

Yanıtlar:


133
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Bir etkinlik çağrıldığında onu manzaraya kilitler. ActivityInfo sınıfındaki diğer bayrakları arayın. Tekrar dikey olarak kilitleyebilir veya sensör / kaydırıcı ile çalıştırabilirsiniz.

Daha fazla bilgi burada: http://www.devx.com/wireless/Article/40792


13
Tamam teşekkürler. Bu harika çalışıyor. Bu mevcut yönelimi alacaktır. getResources (). getConfiguration (). oryantasyon
Jared

7
Dikkatli! GetConfiguration () döndürdükleri ile setRequestedOrientation'ın ne istediğini ayırt etmeniz gerekir - ayrıntılar için aşağıdaki cevabıma bakın
Andy Weinstein

bu yaklaşımla ilgili bir sorun var. Bu cevabın
Bugs Happen

ancak tüm etkinlik için aynı yönelimi ayarlar, yönelimi değiştirebileceğimiz başka bir yol var mı
silverFoxA

106

GetConfiguration'ın döndürdüğü şey ile setRequestedOrientation'ın istediği arasındaki farka dikkat edin - ikisi de int, ancak farklı sabit tanımlardan geliyorlar.

180 derecelik dönüşlere izin verirken mevcut yönü nasıl kilitleyeceğiniz aşağıda açıklanmıştır

int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}

13
Kullanıcı ayarlarda ekran döndürmeyi devre dışı bıraktıysa, bu 180 derece döndürmeye izin vermediğinden SCREEN_ORIENTATION_USER_LANDSCAPE kullanmayı tercih edebilirsiniz. Benzer şekilde, serbest dönüşe geri dönerken, SCREEN_ORIENTATION_USER, SCREEN_ORIENTATION_SENSOR'dan daha iyidir, çünkü ikincisi ayarlar yapmamayı söylese bile serbest dönüşe izin verir.
Steve Waring

Parlak! Ters yönlendirmeye geçtiğinizde yeniden yapılandırmanın gerçekleşmediğini eklemeniz gerekir. En azından test ettiğim cihazlarda. Bazı diyalog gösterileri vb. Sırasında yeniden yapılandırmayı durdurmak isteyip istemediğinizi bilmek gerçekten önemli
sberezin

47

Bu, ters dikey ve ters yatay olan cihazlarda çalışır.

Yönü kilitle:

    int orientation = getActivity().getRequestedOrientation();
    int rotation = ((WindowManager) getActivity().getSystemService(
            Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
    switch (rotation) {
    case Surface.ROTATION_0:
        orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        break;
    case Surface.ROTATION_90:
        orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        break;
    case Surface.ROTATION_180:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        break;
    default:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    }

    getActivity().setRequestedOrientation(orientation);

Yönün kilidini açın:

   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

5
Rotasyon "Returns the rotation of the screen from its "natural" orientation." kaynağını alın . Dolayısıyla, bir telefonda ROTATION_0'ın dikey olduğunu söylemesi büyük olasılıkla doğrudur, ancak bir tablette "doğal" yönü muhtemelen yataydır ve ROTATION_0, portre yerine yatay döndürmelidir.
jp36

@ jp36, telefonla aynı olan doğal bir yönelime sahip bir Nexus 7 üzerinde test ettim. Daha büyük bir tablet (bende olmayan) üzerinde test ettiğiniz için teşekkürler.
pstoppani

1
Jp36'nın dediği gibi, doğal peyzaj yönelimli tabletlerde çalışmıyor!
DominicM

Cihazda ters portreyi nasıl test ederiz?
AndyBoy

27

Sanki benzer bir davam vardı. Herhangi bir yönlendirmeyi desteklemek istedim, ancak iş akışında belirli bir noktadan sonra mevcut yönelimde kalmam gerekiyordu. Benim çözümüm şuydu:

Korumalı iş akışının girişinde:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

Korunan iş akışının çıkışında:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

2
Bu, en azından Android> = 16'da OQ'ya değinmez. SetRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR), cihazı dikeyde olsa bile yatay olarak ayarlayabilir, oysa soru verilen kilitleme yönünü ifade eder.
greg7gkb

3
bana göre, onu nosensor olarak ayarlamak, yataydaysam beni portre moduna geri götürüyor, bunun yerine SCREEN_ORIENTATION_LOCKED kullandım ve benim için çalıştı
Jimmar

1
@JiMMaR SCREEN_ORIENTATION_LOCKED, Android> = 18 için en iyi yoldur. Ancak daha düşük bir şeyi hedeflerseniz, bu işe yaramaz. Aşağıdaki jp36'nın cevabını kullanmanızı öneririm.
Patrick Boos

23

Tabletler için destek @pstoppani cevap Alternatif (@pstoppani cevap olduğu gibi, cihazlarda bu irade sadece iş> 2.2)
üzerinde -Tested Samsung Galaxy SIIIveSamsung Galaxy Tab 10.1

public static void lockOrientation(Activity activity) {
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int tempOrientation = activity.getResources().getConfiguration().orientation;
    int orientation = 0;
    switch(tempOrientation)
    {
    case Configuration.ORIENTATION_LANDSCAPE:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
            orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    }
    activity.setRequestedOrientation(orientation);
}

Teşekkürler, iyi çalışıyor ama neden ||giriş rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90ve çıkış olduğunu anlamadım rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270. Öyleyse 2 şüphem var :::: birincisi, Neden ikinci durum ROTATION_0yerine ROTATION_180ve bir diğeri neden 0 dereceyi 180 değil 90 ile kontrol et?
AndyBoy

@AndyBoy, cihazların varsayılan yönlendirmesiyle ilgisi var. Tipik olarak, telefonların varsayılan bir dikey yönü vardır; bu, döndürmenin dikey için sıfıra döndüğü anlamına gelir, ancak bazı tabletlerde varsayılan bir yatay değer vardır, bu da döndürmenin yatay için sıfıra döndüğü anlamına gelir. Dolayısıyla, farklı ||kontroller, aygıtın yatay ve dikey raporlamasına bağlı olarak olası iki varsayılan yönü ele alıyor.
jp36

5

İşte benim kodum, ekranınızı bu yöntemlerden biriyle kilitleyebilir ve görevi tamamladıktan sonra unlockOrientation ile kilidini açabilirsiniz:

/** Static methods related to device orientation. */
public class OrientationUtils {
    private OrientationUtils() {}

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();

        // Copied from Android docs, since we don't have these values in Froyo 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!BuildVersionUtils.hasGingerbread()) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90){
            if (orientation == Configuration.ORIENTATION_PORTRAIT){
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        }
        else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) 
        {
            if (orientation == Configuration.ORIENTATION_PORTRAIT){
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

0

İşte @pstoppani'nin yukarıdaki cevabının Xamarin dönüşümü.

NOT: Bu bir Parça içindir, Activity'i değiştirin . bununla . bir aktivite içinde kullanılırsa.

public void LockRotation()
{
    ScreenOrientation orientation;

    var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;

    switch (surfaceOrientation) {
        case SurfaceOrientation.Rotation0:
            orientation = ScreenOrientation.Portrait;
            break;
        case SurfaceOrientation.Rotation90:
            orientation = ScreenOrientation.Landscape;
            break;
        case SurfaceOrientation.Rotation180:
            orientation = ScreenOrientation.ReversePortrait;
            break;
        default:
            orientation = ScreenOrientation.ReverseLandscape;
            break;
    }

    Activity.RequestedOrientation = orientation;
}

public void UnlockRotation()
{
    Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}

Bu, kullanılmadan önce farklı bir yaklaşımla olduğu gibi test edilmemiştir, ancak yararlı olabilir.


Bu pstoppani ile aynı cevaptır ve tablette başarısız olacaktır.
Tim Autin
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.