Android पर स्क्रीन रोटेशन को रोकें


315

मेरी एक गतिविधि है जिसे मैं घूमने से रोकना चाहूंगा क्योंकि मैं एक AsyncTask शुरू कर रहा हूं, और स्क्रीन रोटेशन इसे पुनः आरंभ करता है।

क्या इस गतिविधि को बताने का एक तरीका है "उपयोगकर्ता को पागल की तरह अपने फोन को हिला रहा है, भले ही स्क्रीन न करें"?



11
आप स्क्रीन ओरिएंटेशन परिवर्तन और AsyncTasks से निपट सकते हैं। स्क्रीन ओरिएंटेशन परिवर्तनों को रोकना केवल एक आलसी वर्कअराउंड है। और ओरिएंटेशन परिवर्तनों के दौरान एक AsyncTask को जीवित रखना मुश्किल नहीं है :)
रोमेन गाई


56
यह वास्तव में एक समाधान या कुछ कोड, रोमेन प्रदान करने के लिए बहुत अधिक सहायक होगा, बजाय इसके कि "एक समाधान मौजूद है और यह कठिन नहीं है"।
पीटर vdL

2
आप उपयोग कर सकते हैं setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
मारसी

जवाबों:


467

जोड़ना

android:screenOrientation="portrait" 

या

 android:screenOrientation="landscape" 

करने के लिए <activity>तत्व / प्रकट में है और आप काम हो गया।


95
कृपया ध्यान दें कि यह आपके ऐप में एक बग छिपा रहा है, जिससे उपयोगकर्ताओं के लिए इस पर यात्रा करने की संभावना कम हो जाती है। लेकिन वे फिर भी करेंगे। किसी भी कॉन्फ़िगरेशन परिवर्तन से आपकी गतिविधि फिर से शुरू हो सकती है। आपको वास्तव में async कार्य से निपटने के लिए अपनी गतिविधि को सही ढंग से लिखने की आवश्यकता है क्योंकि यह पुनरारंभ होता है।
हैकबोड

1
यह मेरे लिए एक मामले में काम नहीं आया। ऐप खोलने से पहले मेरे पास परिदृश्य के लिए स्क्रीन सेट था। जब मैंने ऐप खोला, तो स्क्रीन पोर्ट्रेट में बदल गई और एसिंक्टस्क पर दूसरी कॉल आई।
user522559

2
आपको चीजों को "पोर्ट्रेट मोड में खोलने" और "हमेशा पोर्ट्रेट मोड में रहने" की आवश्यकता है। केवल 1 करना व्यर्थ है।
कैरोल

1
@hackbod की परवाह किए बिना, यह "एंड्रॉइड ऐप स्क्रीन रोटेशन को रोकने के लिए नंबर 1 1 Google हिट है," मेरी ज़रूरत को async कार्यों से कोई लेना-देना नहीं है
chiliNUT

7
@hackbod इस समस्या से निपटने के लिए हम अपनी गतिविधि को सही तरीके से कैसे लिखते हैं?
user41805

127

आपके चलते समय ऑटो रोटेट स्क्रीन को रोकने के लिए आप नीचे दिए गए तर्क का पालन कर सकते हैं AsyncTask:

  1. अपनी गतिविधि का उपयोग करके अपने वर्तमान स्क्रीन ओरिएंटेशन को स्टोर करें getRequestedOrientation()
  2. उपयोग करके ऑटो स्क्रीन ओरिएंटेशन अक्षम करें setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
  3. भागो / अपने पर अमल करो AsyncTask
  4. AsyncTaskअपने पिछले ओरिएंटेशन स्टेटस का उपयोग करके अपने रिस्टोर के अंत में setRequestedOrientation(oldOrientation)

कृपया ध्यान दें कि एक्सेस करने के कई तरीके हैं Activity(जो UI थ्रेड पर चलता है) प्रॉपर्टीज के अंदर AsyncTask। आप अपने AsyncTaskवर्ग को एक आंतरिक वर्ग के रूप में लागू कर सकते हैं या आप Handlerअपनी Activiyकक्षा को प्रचलित करने वाले संदेश का उपयोग कर सकते हैं ।


9
चयनित उत्तर की तुलना में बहुत बेहतर है।
मतज

3
महान विचार :) आपके पास अपनी वर्तमान स्क्रीन अभिविन्यास संग्रहीत नहीं है जिसे आप
ActivInfo.SCREEN_ORIENTATION_UNSPECIFIED

यह अविश्वसनीय लगता है, @emre, धन्यवाद! ऐसा लगता है "सच होना बहुत अच्छा है!" इस मुद्दे के बारे में चर्चा की भारी मात्रा पर ध्यान दें: stackoverflow.com/q/3821423/294884 ... Android विशेषज्ञों, यहाँ कोई नकारात्मक पहलू है ?! धन्यवाद फिर से .. इतना।
फेटी

3
बकवास !! यदि डिवाइस लैंडस्कैप मोड में BEGIN से होता है तो यह काम नहीं करता है । क्या बकवास है! सक्स: ओ
फेटी

@Emre, यह कोड कुछ मामलों में काम नहीं करता है। उदाहरण के लिए, यदि उपयोगकर्ता ने आपके AsyncTask की शुरुआत और इसके अंत के बीच अपने अभिविन्यास को बदल दिया है। आपने तब गलत अभिविन्यास को सहेजा और पुनर्स्थापित किया होगा।
पचेरियर

27

अपनी मैनिफ़ेस्ट फ़ाइल में, प्रत्येक गतिविधि के लिए जिसे आप स्क्रीन रोटेशन ऐड को लॉक करना चाहते हैं: यदि आप इसे क्षैतिज मोड में लॉक करना चाहते हैं:

<activity
        ...
        ...
        android:screenOrientation="landscape">

या यदि आप इसे वर्टिकल मोड में लॉक करना चाहते हैं:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

मुझे ऐसा करने का सबसे आसान तरीका लगा

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

OnCreate के भीतर, बस के बाद

setContentView(R.layout.activity_main);

इसलिए...

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

7

AndroidManifest में जाने के बजाय, आप ऐसा कर सकते हैं:

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

यहां एकमात्र दोष यह है कि इसके लिए एपीआई स्तर 18 या उच्चतर की आवश्यकता होती है। तो मूल रूप से यह भाले की नोक है।


यह भाग घर और हाल के ऐप्स बटन को अक्षम कर रहा है और यहां तक ​​कि SCREEN_ORIENTATION_FULL_SENSOR के साथ लॉक जारी करने के बाद भी, अक्षम अवस्था में है। Android N में
kAmol

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

AndroidManifest.xml में गतिविधि पर निम्नलिखित विशेषता आप सभी की जरूरत है:

android:configChanges="orientation"

तो, पूर्ण गतिविधि नोड होगा:

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

जोड़ें:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

अपने AndroidManifest.xml पर निम्न जोड़ें

[app> src> main> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

उदाहरण:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">

   <uses-permission android:name="A-PERMISSION" />

   <application>
      <activity android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:configChanges="orientation">
      </activity>
   </application>

</manifest>

0

यदि आप Android डेवलपर टूल (ADT) और ग्रहण का उपयोग कर रहे हैं, तो आप अपने AndroidManifest.xml -> एप्लिकेशन टैब पर जा सकते हैं -> नीचे जाएं और अपनी गतिविधि चुनें। अंत में, अपने पसंदीदा अभिविन्यास का चयन करें। आप कई विकल्पों में से एक का चयन कर सकते हैं।


0

आपको मेनिफ़ेस्ट.xml फ़ाइल में निम्न कोड जोड़ना होगा। जिस गतिविधि के लिए इसे घूमना नहीं चाहिए, उस गतिविधि में यह तत्व जोड़ें

android:screenOrientation="portrait"

फिर यह नहीं घूमेगा।


0

आप इस तरह से कोशिश कर सकते हैं

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


0

गतिविधि बदलने पर भी अपने डेटा को सुरक्षित रखने के लिए AsyncTaskLoader का उपयोग करें , इसके बजाय AsyncTask का उपयोग करें जो स्क्रीन रोटेशन को रोकने की तुलना में ऐप्स बनाने का एक बेहतर तरीका है।


0

स्क्रीन रोटेशन को रोकें बस अपने घोषणापत्र में इस पंक्ति को जोड़ें।

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

यह मेरे लिए काम करता है।


0

"portrait"आपकी AndroidManifest.xml फ़ाइल में उपयोगकर्ता एक अच्छे समाधान की तरह लग सकता है। लेकिन यह कुछ उपकरणों (जो परिदृश्य में सबसे अच्छा काम करता है) को उचित अभिविन्यास नहीं मिलने पर, पोर्ट्रेट में जाने के लिए मजबूर करता है। नवीनतम Android संस्करण पर, आपको एक त्रुटि मिल जाएगी। तो मेरा सुझाव यह उपयोग करने के लिए बेहतर है "nosensor"

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