रनटाइम के दौरान ओरिएंटेशन लॉक कैसे करें


107

क्या रनटाइम के दौरान ओरिएंटेशन लॉक करने का कोई तरीका है? उदाहरण के लिए, मैं उपयोगकर्ता को परिदृश्य में स्क्रीन को लॉक करने की अनुमति देना चाहता हूं यदि उपयोगकर्ता वर्तमान में परिदृश्य में है और मेनू विकल्प को टॉगल करता है।

जवाबों:


133
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

एक गतिविधि पर कहा जाता है, इसे परिदृश्य में बंद कर दिया जाएगा। एक्टिविटीइन्फो क्लास में अन्य झंडों के लिए देखें। आप इसे चित्र पर वापस ला सकते हैं या इसे सेंसर / स्लाइडर चालित बना सकते हैं।

अधिक जानकारी यहां: http://www.devx.com/wireless/Article/40792


13
ठीक है धन्यवाद। यह बहुत अच्छा काम करता है। यह वर्तमान अभिविन्यास प्राप्त करेगा। getResources ()। getConfiguration ()। ओरिएंटेशन
जारेड

7
सावधान! आपको प्राप्त होने वाले अंतर के बीच अंतर करने की आवश्यकता है (रिटर्न) और क्या setRequestedOrientation चाहता है - विवरण के लिए मेरा जवाब नीचे देखें
एंडी वेनस्टेन

इस दृष्टिकोण के साथ एक मुद्दा है। सुनिश्चित करें कि आप इस उत्तर
बग्स हैपन

लेकिन यह सभी गतिविधि के लिए एक ही अभिविन्यास निर्धारित करता है, क्या कोई ऐसा तरीका है जहां हम अभिविन्यास को बदल सकते हैं
SilverFoxA

106

GetConfiguration रिटर्न और क्या setRequestedOrientation चाहता है के बीच के अंतर से सावधान रहें - वे दोनों अंतर हैं, लेकिन वे विभिन्न निरंतर परिभाषाओं से आ रहे हैं।

यहां 180 डिग्री फ़्लिप की अनुमति देते हुए वर्तमान ओरिएंटेशन को लॉक करने का तरीका बताया गया है

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

13
आप SCREEN_ORIENTATION_USER_LANDSCAPE का उपयोग करना पसंद कर सकते हैं क्योंकि यदि उपयोगकर्ता ने सेटिंग्स में स्क्रीन रोटेशन को अक्षम कर दिया है तो यह 180 डिग्री फ़्लिप नहीं होने देगा। इसी तरह जब फ्री रोटेशन पर वापस जाना होता है, तो SCREEN_ORIENTATION_USER SCREEN_ORIENTATION_SENSOR से बेहतर होता है क्योंकि बाद में फ्री रोटेशन की अनुमति होती है, भले ही सेटिंग्स न कहे।
स्टीव वार्निंग

प्रतिभाशाली! जब आप रिवर्स ओरिएंटेशन पुन: कॉन्फ़िगर करने के लिए स्विच करते हैं, तो इसे जोड़ने की आवश्यकता नहीं होती है। कम से कम जिन उपकरणों पर मैंने इसका परीक्षण किया है। यह जानना महत्वपूर्ण है कि क्या आप कुछ डायलॉग शो आदि के दौरान पुनर्निर्माण को रोकना चाहते हैं
sberezin

47

यह रिवर्स पोर्ट्रेट और रिवर्स लैंडस्केप वाले उपकरणों पर काम करता है।

उन्मुखीकरण बंद करना:

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

अनलॉक उन्मुखीकरण:

   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

5
रोटेशन "Returns the rotation of the screen from its "natural" orientation." स्रोत प्राप्त करें । तो एक फोन पर ROTATION_0 कह रहा है कि चित्र सही होने की संभावना है, लेकिन एक टैबलेट पर इसके "प्राकृतिक" अभिविन्यास की संभावना परिदृश्य है और ROTATION_0 को चित्र के बजाय परिदृश्य को लौटाना चाहिए।
jp36

@ jp36, मैंने एक नेक्सस 7 पर परीक्षण किया है जिसमें एक प्राकृतिक अभिविन्यास है जो फोन के समान है। एक बड़े टैबलेट पर परीक्षण के लिए धन्यवाद (जो मेरे पास नहीं है)।
पस्तोपनी

1
जैसा कि jp36 ने कहा, यह एक प्राकृतिक परिदृश्य अभिविन्यास वाली गोलियों पर काम नहीं करता है!
डोमिनिक

हम डिवाइस में रिवर्स पोर्ट्रेट का परीक्षण कैसे करते हैं ??
एंडीबॉय

27

मुझे ऐसा ही मामला लग रहा था। मैं किसी भी अभिविन्यास का समर्थन करना चाहता था, लेकिन मुझे वर्कफ़्लो में एक निश्चित बिंदु के बाद वर्तमान अभिविन्यास में रहने की आवश्यकता थी। मेरा समाधान था:

संरक्षित वर्कफ़्लो के प्रवेश पर:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

संरक्षित वर्कफ़्लो से बाहर निकलने पर:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

2
यह OQ को कम से कम Android> = 16 पर संबोधित नहीं करता है। setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) चित्र में होने पर भी डिवाइस को परिदृश्य पर सेट कर सकता है, जबकि प्रश्न लॉकिंग ओरिएंटेशन को संदर्भित करता है जो दिया गया था।
greg7gkb

3
मेरे लिए, इसे nosensor पर सेट करना मुझे पोर्ट्रेट मोड पर वापस ले जाता है अगर मैं लैंडस्केप पर था तो मैंने इसके बजाय SCREEN_ORIENTATION_LOCKED का उपयोग किया और यह मेरे लिए काम किया
जिममार

1
@JiMMaR SCREEN_ORIENTATION_LOCKED Android> = 18 के लिए सबसे अच्छा तरीका है। लेकिन अगर आप कुछ कम लक्ष्य करते हैं, तो यह काम नहीं करता है। मैं नीचे jp36 के उत्तर का उपयोग करने का सुझाव देता हूं।
पैट्रिक बूस

23

टैबलेट के लिए समर्थन के साथ @pstoppani उत्तर के लिए वैकल्पिक (@ststani उत्तर के साथ, यह केवल उपकरणों पर काम करेगा> 2.2)
पर आधारित Samsung Galaxy SIIIऔरSamsung 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);
}

धन्यवाद, यह ठीक काम कर रहा है, लेकिन मुझे समझ में नहीं आया कि यह क्यों और साथ ||में जाँच रहा है । इसलिए मैं 2 संदेह है :::: पहले, क्यों के बजाय दूसरे मामले में और एक अन्य कारण है कि 90 नहीं 180 से 0 डिग्री जाँच ?? rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270ROTATION_0ROTATION_180
एंडीबॉय

@AndyBoy यह उपकरणों के डिफ़ॉल्ट अभिविन्यास के साथ करना है। आमतौर पर फोन में पोर्ट्रेट का डिफॉल्ट ओरिएंटेशन होता है जिसका मतलब है कि रोटेशन पोर्ट्रेट के लिए जीरो रिटर्न देता है, लेकिन कुछ टैबलेट्स में लैंडस्केप का डिफॉल्ट होता है, जिसका मतलब है कि रोटेशन लैंडस्केप के लिए जीरो रिटर्न देता है। इसलिए अलग-अलग ||जाँच उपकरण बनाम परिदृश्य चित्र के आधार पर दो संभावित डिफ़ॉल्ट झुकावों को संभाल रहे हैं।
jp36

5

यहाँ मेरा कोड है, आप इन तरीकों में से एक को अपनी स्क्रीन से लॉक कर सकते हैं और एक बार कार्य को अनलॉक करने के बाद अनलॉक कर सकते हैं।

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

यहाँ ऊपर @pstoppani के उत्तर का Xamarin रूपांतरण है।

नोट: यह एक फ़्रैगमेंट के लिए है, गतिविधि को बदलें इसके साथ यदि किसी गतिविधि के भीतर उपयोग किया जाता है।

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

यह उपयोग किए जाने से पहले एक अलग दृष्टिकोण के साथ चला गया है, लेकिन बिना उपयोग के हो सकता है।


यह pstoppani's के समान ही उत्तर है, और यह एक टैबलेट पर विफल हो जाएगा।
टिम ऑटिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.