मैं Android पर अभिविन्यास परिवर्तन को कैसे अक्षम करूं?


287

मेरे पास एक एप्लिकेशन है जिसे मैं सिर्फ पोर्ट्रेट मोड में उपयोग करना चाहता हूं, इसलिए मैंने प्रकट XML में एंड्रॉइड: स्क्रीनऑरिएशन = "पोर्ट्रेट" को परिभाषित किया है। यह एचटीसी मैजिक फोन के लिए ठीक काम करता है (और साथ ही अन्य फोन पर ओरिएंटेशन परिवर्तन को रोकता है)।

लेकिन मुझे HTC G1 फोन में समस्या है क्योंकि मैं हार्डवेयर QWERTY कीबोर्ड (वर्चुअल कीबोर्ड नहीं) खोलता हूं । मेरी गतिविधि पोर्ट्रेट मोड में रहती है, लेकिन लगता है कि यह पुनः आरंभ हो जाएगा और अपने सभी राज्यों को खो देगा। एचटीसी हीरो संस्करण के साथ ऐसा नहीं होता है ।

मेरा आवेदन काफी बड़ा है, इसलिए मैं नहीं चाहता कि कीबोर्ड के खुलने पर वह अपने सभी राज्यों को पुनः आरंभ और खो दे। मैं इसे कैसे रोक सकता हूं?


2
यहाँ भी देखने का प्रयास करें: stackoverflow.com/questions/2366706/…
एंडी वेनस्टेन

जवाबों:


317

अप्रैल 2013 को अपडेट करें: ऐसा न करें। 2009 में यह एक अच्छा विचार नहीं था जब मैंने पहली बार सवाल का जवाब दिया था और यह वास्तव में अब एक अच्छा विचार नहीं है। इस जवाब को हैकबॉड द्वारा कारणों के लिए देखें:

Android में अभिविन्यास परिवर्तन पर एसिंक्टस्क के साथ पुनः लोड करने की गतिविधि से बचें

android:configChanges="keyboardHidden|orientation"अपने AndroidManifest.xml में जोड़ें । यह सिस्टम को बताता है कि आप अपने आप को संभालने के लिए क्या कॉन्फ़िगरेशन बदलते हैं - इस मामले में कुछ भी नहीं करने से।

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

अधिक विवरण के लिए डेवलपर संदर्भ कॉन्फिगरेशन देखें।

हालाँकि, आपके एप्लिकेशन को किसी भी समय बाधित किया जा सकता है, उदाहरण के लिए, फ़ोन कॉल द्वारा, इसलिए आपको अपने आवेदन की स्थिति को बचाने के लिए कोड जोड़ना चाहिए जब इसे रोका जाता है।

अद्यतन: Android 3.2 के रूप में, आपको "स्क्रीनसेज़" भी जोड़ना होगा:

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

डेवलपर गाइड से कॉन्फ़िगरेशन को संभालना स्वयं को बदलें

सावधानी: एंड्रॉइड 3.2 (एपीआई स्तर 13) के साथ शुरुआत, "स्क्रीन आकार" भी बदलता है जब डिवाइस पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच स्विच करता है। इस प्रकार, यदि आप एपीआई स्तर 13 या उच्चतर (जैसा कि minSdkVersion और targetSdkVersion विशेषताओं द्वारा घोषित किया गया है) के लिए विकसित होने पर अभिविन्यास परिवर्तन के कारण रनटाइम पुनरारंभ को रोकना चाहते हैं, तो आपको "ओरिएंटेशन" मान के अतिरिक्त "स्क्रीनसेज़" मान को शामिल करना होगा। यानी आपको घोषित करना होगा android:configChanges="orientation|screenSize"। हालाँकि, यदि आपका एप्लिकेशन API स्तर 12 या उससे कम लक्ष्य करता है, तो आपकी गतिविधि हमेशा इस कॉन्फ़िगरेशन परिवर्तन को स्वयं संभालती है (यह कॉन्फ़िगरेशन परिवर्तन आपकी गतिविधि को पुनरारंभ नहीं करता है, यहां तक ​​कि एंड्रॉइड 3.2 या उच्चतर डिवाइस पर चलने पर भी)।


36
बस इसे जोड़ने और वास्तव में स्पष्ट होने के लिए, एंड्रॉइड किसी भी समय उन्मुखीकरण परिवर्तनों की परवाह किए बिना, आपके आवेदन को निर्दयता से मार सकता है, इसलिए आपको राज्य को बचाने के लिए onPause () और onSaveInstanceState () का उपयोग करना चाहिए, चाहे जो भी हो।
एरिक मिल

3.2 अद्यतन बहुत उपयोगी था और जो मुझे अवरुद्ध कर रहा था। मुझे पता नहीं था कि मेरे ऑनकोनफिगरेशनचैन्ड हैंडलर ने फायरिंग क्यों नहीं की और यह वह थी। धन्यवाद!
स्वीटलील्म्रे

तीसरा परम - स्क्रीनसेज़ 2.3.x में नहीं मिल सकता है, क्या मुझे स्क्रीनलेयूट में बदलना चाहिए?
डेडफिश

2
@ लुम्मा नहीं, "स्क्रीनसाइज" केवल एंड्रॉइड 3.2 और नए के लिए आवश्यक है। आप किस स्तर के एपीआई को लक्षित कर रहे हैं? मुझे लगता है कि आपको केवल इसे जोड़ने की आवश्यकता है यदि आप स्तर 13 या उससे ऊपर का लक्ष्य बना रहे हैं। मैं स्पष्ट करने के लिए उत्तर को अपडेट करूंगा।
Intrications

1
बस अगर यह अन्य लोगों के लिए सहायक होता है, तो मैंने आप दोनों को पाया है ... एंड्रॉइड: configChanges = "ओरिएंटेशन" ...> परिवर्तनों को ओवरराइड करने के लिए और <... एंड्रॉइड: स्क्रीनऑरिएशन = "पोर्ट्रेट" ...> डिफ़ॉल्ट परिभाषित करें।
शोगर

97

आपको AndroidManifest.xml को Intrications (पहले एश्टन) के रूप में संशोधित करने की आवश्यकता है और सुनिश्चित करें कि गतिविधि ऑनकॉन्फिगरेशनहैन्ज किए गए इवेंट को संभालती है क्योंकि आप इसे संभालना चाहते हैं। यह इस तरह दिखना चाहिए:

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

जैसा कि दिमित्री ज़ैतसेव ने कहा है, अंदर डालना बेहतर setRequestedOrientation()है onCreate()
टिम्मम

3
onConfigurationChanged()इससे पहले यह नहीं कहा जाता है कि onCreate()क्या oncreate में contentViews सेट करने से पहले ऐसा ओरिएंटेशन सेट करना बेहतर तरीका है, कॉन्फ़िगरेशन सेट करना जहाँ वह है वह भी क्लीनर है तो यह उत्तर अभी भी अच्छा है।
शमूएल

39

मैंने हमेशा पाया है कि आपको दोनों की आवश्यकता है

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

22

जैसा कि कहा गया है, android:configChangesअपनी गतिविधि का सेट (प्रकट फाइल में) keyboardHidden|orientationऔर फिर:

1) ओवरराइड onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) इस लाइन को अपनी गतिविधि में जोड़ें onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

यह उसी पंक्ति को जोड़ने से बेहतर है onConfigurationChanged, क्योंकि आपका ऐप पोर्ट्रेट मोड में बदल जाएगा और फिर लैंडस्केप में वापस आएगा (यह केवल एक बार होगा, लेकिन यह कष्टप्रद है)।

इसके अलावा, आप android:screenOrientation="nosensor"अपनी गतिविधि (प्रकट में) के लिए सेट कर सकते हैं । लेकिन इस तरह से प्रयोग करने से आप अभिविन्यास में बदलाव को नहीं संभाल सकते हैं।


यदि मैं रोटेशन पर गतिविधि के पुन: निर्माण से बचना चाहता हूं, तो मुझे क्या करना चाहिए, फिर भी मैं उपयोगकर्ता को ओएस की सेटिंग्स के माध्यम से अभिविन्यास को लॉक करने की अनुमति देना चाहता हूं?
Android डेवलपर

@androiddeveloper एक अलग सवाल है, जिसका पहले से ही एक जवाब है: stackoverflow.com/a/14771495/926907
दिमित्री ज़ायतसेव

आपका लिंक कॉन्फ़िगरेशन बदलते समय अपने आप से सामग्री को बदलने के बारे में है, फिर भी मैं गतिविधि के रोटेशन से बचने की इच्छा रखता हूं (ताकि यह ठीक उसी तरह रहेगा जैसा वह दिखता है) यदि उपयोगकर्ता ने ओएस के माध्यम से अभिविन्यास को लॉक करने के लिए चुना है। सेटिंग्स (अधिसूचना दराज में त्वरित सेटिंग्स के माध्यम से कुछ उपकरणों पर उपलब्ध)।
Android डेवलपर

@androiddeveloper आह, मुझे लगता है कि मैं समझ गया। फिर इस लिंक पर एक नज़र डालें: developer.android.com/reference/android/… डॉक्स के अनुसार, डिफ़ॉल्ट अभिविन्यास को पहले से ही उपयोगकर्ता की प्राथमिकता को ध्यान में रखना चाहिए। अगर ऐसा नहीं है, तो मुझे संदेह है कि यह एक ओएस विशिष्ट व्यवहार है। मुझे आपके परिणामों के बारे में सुनकर खुशी होगी - अब मैं भी इसमें दिलचस्पी ले रहा हूं :)
दिमित्री ज़ेत्सेव

मुझे पता है कि डिफ़ॉल्ट उपयोगकर्ता की प्राथमिकताओं को संभाल लेगा, लेकिन यह स्क्रीन को घुमाते समय गतिविधि को फिर से बनाता है, जो कुछ ऐसा है जो मैं नहीं चाहता।
Android डेवलपर


13

अपनी गतिविधि के OnCreate विधि में इस कोड का उपयोग करें:

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

अब आपका अभिविन्यास पोर्ट्रेट के लिए सेट हो जाएगा और कभी नहीं बदलेगा।


4
इसके साथ ही आप हर बार ओरिएंटेशन कॉन्फ़िगरेशन बदलने पर गतिविधि को फिर से शुरू करने से नहीं रोकते हैं।
एक्सपेक्टेक्ट

यदि आप लैंडस्केप ओरिएंटेशन में पिछली गतिविधि से गतिविधि दर्ज करते हैं, तो भी यह काम नहीं करता है।
w3bshark

10

AndroidManifest.xml फ़ाइल में, प्रत्येक गतिविधि के लिए जिसे आप अंतिम screenOrientationपंक्ति जोड़ना चाहते हैं :

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

या एंड्रॉइड: स्क्रीनऑरिएशन = "लैंडस्केप"


8

अपने Androidmanifest.xml फ़ाइल में:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

या

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

6

कोड द्वारा स्क्रीन को लॉक करने के लिए आपको स्क्रीन के वास्तविक रोटेशन (0, 90, 180, 270) का उपयोग करना होगा और आपको इसकी प्राकृतिक स्थिति को जानना होगा, स्मार्टफोन में प्राकृतिक स्थिति पोर्ट्रेट और एक टैबलेट में होगी। यह लैंडस्केप होगा।

यहां कोड (लॉक और अनलॉक तरीके) हैं, यह कुछ उपकरणों (स्मार्टफोन और टैबलेट) में परीक्षण किया गया है और यह बहुत अच्छा काम करता है।

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

गतिविधि के रूप में क्या पैरामेटर पारित किया जाना चाहिए?
विष्टि

वह गतिविधि जो अपने अभिविन्यास को लॉक / अनलॉक करने के लिए विधि को बुलाती है। यह एक पब्लिक स्टेटिक यूटिलिटी मेथड है जिसे डिफरेंट एक्टिविटीज से बुलाया जा सकता है।
पीओके

1
महान काम करता है, लेकिन, गंभीरता से, एंड्रॉइड, हमें लॉक स्क्रीन ओरिएंटेशन के लिए यह सब क्यों करना है ***!
कोकरिको जूल 3'14

हाँ। यह एक अभिविन्यास को लॉक करता है जैसा कि हम मेनिफेस्ट में करते हैं। यह onConfigurationChanged को अब लागू होने से रोकेगा। क्या कोई ऐसा तरीका है जो UI को लैंडस्केप में लॉक करता है और फिर भी onConfigurationChanged को इनवॉइस करता है। ठीक उसी तरह जैसे एंड्रॉइड में कैमरा ऐप
अजीथ मेमन

SDK 18+ पर एक SCREEN_ORIENTATION_LOCKED झंडा है जो काम करने लगता है लेकिन आप फिर भी हर डिवाइस को सपोर्ट करने के लिए ऊपर दिए गए कोड का उपयोग करना चाहेंगे
DominicM

2

विजुअल स्टूडियो ज़मारिन में:

  1. जोड़ें:

using Android.Content.PM; आप के लिए नाम सूची सूची गतिविधि।

  1. जोड़ें:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

आप के लिए एक विशेषता के रूप में वर्ग, उस तरह:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

यह प्रश्न एंड्रॉइड के बारे में पूछ रहा है, न कि ज़ामरीन। एंड्रॉइड
ट्रेवर हार्ट


0

कृपया ध्यान दें, कोई भी तरीका अब काम नहीं करता है!

में एंड्रॉयड स्टूडियो 1 एक सरल तरीका है जोड़ने के लिए है android:screenOrientation="nosensor"

यह प्रभावी रूप से स्क्रीन ओरिएंटेशन को लॉक करता है।

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