बल "पोर्ट्रेट" अभिविन्यास मोड


298

मैं अपने आवेदन के लिए "पोर्ट्रेट" मोड को लागू करने की कोशिश कर रहा हूं क्योंकि मेरा एप्लिकेशन "लैंडस्केप" मोड के लिए बिल्कुल तैयार नहीं है।

कुछ मंचों को पढ़ने के बाद, मैंने अपनी घोषणा फ़ाइल में इन पंक्तियों को जोड़ा:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

लेकिन यह मेरे डिवाइस (एचटीसी डिजायर) पर काम नहीं करता है। यह "पोर्ट्रेट" लो "लैंडस्केप" से स्विच होता है, मैनिफ़ेस्ट फ़ाइल की पंक्तियों को अनदेखा करता है।

अधिक मंचों को पढ़ने के बाद, मैंने अपनी घोषणा फ़ाइल में इसे जोड़ने की कोशिश की:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

और मेरी गतिविधि वर्ग में यह कार्य:

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

लेकिन फिर, भाग्य नहीं।

जवाबों:


531

अनुप्रयोग तत्व के लिए अभिविन्यास लागू न करें , इसके बजाय आपको गतिविधि तत्व पर विशेषता को लागू करना चाहिए , और आपको configChangesनीचे दिए गए अनुसार भी सेट करना होगा ।

उदाहरण:

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

इसे मैनिफ़ेस्ट फ़ाइल में लागू किया जाता है AndroidManifest.xml


26
के लिए configChanges क्या है?
Dror

71
@ ऑर्केस्ट्रेटर, कॉन्फिगरेशंस का मतलब है कि कॉन्फ़िगरेशन परिवर्तन को गतिविधि द्वारा ही नियंत्रित किया जाता है। इसके बिना, अभिविन्यास परिवर्तन होने पर गतिविधि फिर से शुरू हो जाएगी। आप पूछ सकते हैं, यदि आपने निर्दिष्ट किया है कि अभिविन्यास "चित्र" है तो यह कभी कैसे बदलेगा? यह बदल सकता है यदि आप एक और गतिविधि लॉन्च करते हैं जो अभिविन्यास को बदल देती है, तो वह नई गतिविधि बाहर निकल जाती है, जो आपको आपकी गतिविधि पर वापस लौटाती है। उदाहरण के लिए, सैमसंग गैलेक्सी एस 3 पर डिफ़ॉल्ट छवि कैप्चर आशय कुछ झुकावों में है।
गॉर्डन मैक्रेइट

2
@GordonMcCreight, क्या आप इसे एक वास्तविक उदाहरण के साथ समझा सकते हैं "आप पूछ सकते हैं, यदि आपने निर्दिष्ट किया है कि अभिविन्यास" चित्र "है तो यह कभी कैसे बदल जाएगा? यह बदल सकता है यदि आप एक और गतिविधि लॉन्च करते हैं जो अभिविन्यास को बदल देती है, तो वह? नई गतिविधि बाहर निकलती है, जो आपको आपकी गतिविधि पर वापस लौटाती है। "
तुषार पांडे

3
पक्की बात, @ तुषारपांडे अगर मैं सही ढंग से याद करूं, तो इससे हमें दुख हुआ था, जब हमारी गतिविधि ने सैमसंग गैलेक्सी एस 3 पर डिफ़ॉल्ट छवि पर कब्जा करने का इरादा शुरू किया था। असल में, हम सिर्फ एक तस्वीर लेना चाहते थे और परिणाम प्राप्त करना चाहते थे। हालाँकि, जब कैमरा आशय वापस आया, तो यह एक अभिविन्यास परिवर्तन का कारण बना जिसने हमारी गतिविधि में राज्य को मिटा दिया, क्योंकि हमें विश्वास नहीं था कि हमें उस से बचाने की आवश्यकता है (यह देखते हुए कि हमारा पूरा ऐप केवल "पोर्ट्रेट" अभिविन्यास में था)। गैलेक्सी S3 ऐसा कैसे और क्यों करता है, यह मेरी (सीमित रूप से सीमित) समझ से परे है।
गॉर्डन मैक्रेइट

8
"कीबोर्डहाइड" क्यों शामिल है?
गोंजोब्राईंस

24

ध्यान दें कि

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

को मैनिफ़ेस्ट फ़ाइल में जोड़ा जाता है - जहाँ गतिविधि परिभाषित होती है।


13

मुझे लगता है कि android:screenOrientation="portrait"इसका उपयोग व्यक्तिगत गतिविधियों के लिए किया जा सकता है। तो <activity>टैग में उस विशेषता का उपयोग करें :

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

13

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

आपके एप्लिकेशन बेस क्लास में आपको एक जीवनचक्र कॉलबैक मिलेगा

इसलिए मूल रूप से प्रत्येक गतिविधि के लिए क्या होता है जब एप्लिकेशन क्लास में बनाते हैं तो यहां ट्रिगर हो जाता है।

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

आशा है कि ये आपकी मदद करेगा।


1
कुशल उत्तर! यह सही उत्तर होना चाहिए, खासकर उन लोगों के लिए जो जटिल ऐप विकसित कर रहे हैं जो बड़ी संख्या में गतिविधि पर निर्भर करते हैं।
FEBRYAN एएसए परदाना

10

पोर्ट पोर्ट्रेट या लैंडस्केप मोड सेट करें , क्रमशः लाइनें जोड़ें।

नीचे पंक्ति आयात करें:

import android.content.pm.ActivityInfo;

ऊपर बस नीचे पंक्ति जोड़ें setContentView(R.layout.activity_main);

के लिए पोर्ट्रेट :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

के लिए landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

यह निश्चित रूप से काम करेगा।


1
कुछ उपकरणों पर एंड्रॉइड 9 के साथ यह विफल हो जाता है - स्क्रीन रोटेशन संक्रमण एक संक्षिप्त क्षण को दिखाई देता है, भले ही आप केवल PORTRAIT का उपयोग करें
इगोर वोज्डा

क्या आप कृपया उस डिवाइस जानकारी को निर्दिष्ट कर सकते हैं जिसमें आपको यह सामना करना पड़ता है, यदि संभव हो तो
पार्थ पटेल

4

एंड्रॉइड के प्रलेखन के अनुसार, आपको अक्सर screenSizeएक संभावित कॉन्फ़िगरेशन परिवर्तन के रूप में भी शामिल करना चाहिए ।

android:configChanges="orientation|screenSize"

यदि आपका आवेदन एपीआई स्तर 13 या उच्चतर है (जैसा कि minSdkVersion और targetSdkVersion विशेषताओं द्वारा घोषित किया गया है), तो आपको "स्क्रीनसाइज़" कॉन्फ़िगरेशन भी घोषित करना चाहिए, क्योंकि यह तब भी बदलता है जब डिवाइस पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच स्विच करता है।

इसके अलावा, अगर आप सभी मूल्य में शामिल हैं keyboardHiddenअपने उदाहरण में, आप तो यह भी नहीं मानना चाहिए locale, mcc, fontScale, keyboardऔर दूसरों को? ..


3

मेरे पास यह लाइन मेरे AndroidManifest.xml में थी

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

जिसे मैंने बदल दिया (बस जोड़ा गया android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

यह मेरे लिए तय चीजें हैं।


2

पूरक करने के लिए कुछ: मैंने हाल ही में एक ऐप अपडेट किया है, पिछले परिदृश्य और पोर्ट्रेट मोड दोनों में काम कर रहा था, और मैं चाहता हूं कि अपडेटेड संस्करण को पोर्ट्रेट मोड में काम करना चाहिए, इसलिए मैंने जोड़ा

android:screenOrientation="portrait"

इसी गतिविधि के लिए, और यह सिर्फ दुर्घटनाग्रस्त हो गया जब मैंने अपडेट का परीक्षण किया। फिर मैंने जोड़ा

android:configChanges="orientation|keyboardHidden"

भी, और यह काम करता है।


1
यदि यह प्रश्न का उत्तर नहीं है, तो इसे टिप्पणी के रूप में जोड़ सकते हैं।
जेपीआरडी

जांचें कि आपने इसे एप्लिकेशन ब्लॉक के लिए गतिविधि में जोड़ा है
वॉरेन-

1

मुझे लगता है कि आप android:configChanges="orientation|keyboardHidden"अपनी गतिविधि में जोड़ना चाहते हैं ? अन्यथा गतिविधि को फिर से कॉन्फ़िगर-परिवर्तन पर फिर से शुरू किया जाता है। onConfigurationChanged, उसके बाद ही बुलाया नहीं किया जाएगाonCreate


1

आप में अलग झुकाव का समर्थन करना चाहते हैं debugऔर releaseबनाता है, लिखने तो (देखें https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest )।

में build.gradleअपने के appफ़ोल्डर में लिखने की:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

तब AndroidManifestआप इस चर "अभिविन्यास" का किसी में भी उपयोग कर सकते हैं Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

आप जोड़ सकते हैं android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]डीबग और manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]रिलीज़ में,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

संक्षिप्त उत्तर: यह मत करो।

अपने ऐप को फिर से डिज़ाइन करें ताकि यह पोर्ट्रेट और लैंडस्केप मोड दोनों में चल सके। UI जैसी कोई चीज नहीं है जिसे पोर्ट्रेट और लैंडस्केप दोनों में काम करने के लिए डिज़ाइन नहीं किया जा सकता है; केवल आलसी या अकल्पनीय डेवलपर्स।

कारण बल्कि सरल है। आप चाहते हैं कि जितना संभव हो उतने अलग-अलग उपकरणों पर आपका ऐप जितना संभव हो उतना दर्शकों के लिए उपयोगी हो। एक विशेष स्क्रीन अभिविन्यास के लिए मजबूर करके, आप अपने एप्लिकेशन को उन उपकरणों पर चलने (बेकार) से रोकते हैं जो उस अभिविन्यास का समर्थन नहीं करते हैं और आप संभावित ग्राहकों को निराश करते हैं और अलग अभिविन्यास पसंद करते हैं।

उदाहरण: आप पोर्ट्रेट मोड को मजबूर करने के लिए अपना ऐप डिज़ाइन करें। एक ग्राहक 2-इन -1 डिवाइस पर ऐप डाउनलोड करता है जिसे वे मुख्यतः लैंडस्केप मोड में उपयोग करते हैं।
परिणाम 1: आपका एप्लिकेशन अनुपयोगी है, या आपका ग्राहक अपने डिवाइस को अनडॉक करने, उसे घुमाने और एक अभिविन्यास में उपयोग करने के लिए मजबूर है जो उनके लिए परिचित या आरामदायक नहीं है।
परिणाम 2: ग्राहक आपके ऐप के गैर-सहज डिजाइन से निराश हो जाता है और एक विकल्प ढूंढता है या ऐप को पूरी तरह से खोद देता है।

मैं इस समय एक ऐप के साथ लड़ रहा हूं और एक उपभोक्ता और एक डेवलपर के रूप में, मुझे इससे नफरत है। यह ऐप जितना उपयोगी है, उतने ही शानदार हैं, जितने कि यह फीचर है, मुझे यह ऐप बिल्कुल पसंद नहीं है क्योंकि यह मुझे एक ओरिएंटेशन का उपयोग करने के लिए मजबूर करता है जो हर दूसरे तरीके से काउंटर है जो मैं अपने डिवाइस का उपयोग करता हूं।

आप अपने ग्राहकों को अपने ऐप से नफरत नहीं करना चाहते हैं।


मुझे पता है कि यह सीधे सवाल का जवाब नहीं देता है, इसलिए मैं उत्सुक लोगों के लिए इसे थोड़ा और विस्तार से बताना चाहता हूं।

डेवलपर्स के लिए कोड लिखने में वास्तव में अच्छा होने और डिजाइन में वास्तव में भयानक होने की प्रवृत्ति है। यह सवाल, हालांकि यह एक कोड प्रश्न जैसा लगता है और पूछने वाला निश्चित रूप से ऐसा महसूस करता है कि यह एक कोड प्रश्न है, वास्तव में एक डिजाइन प्रश्न है।

सवाल वास्तव में है "क्या मुझे अपने ऐप में स्क्रीन ओरिएंटेशन लॉक करना चाहिए?" पूछने वाले ने यूआई को कार्य करने के लिए चुना और केवल पोर्ट्रेट मोड में अच्छा लग रहा था। मुझे संदेह है कि यह विकास के समय को बचाने के लिए था या क्योंकि ऐप का वर्कफ़्लो विशेष रूप से एक पोर्ट्रेट लेआउट (मोबाइल गेम के लिए आम) के लिए अनुकूल है। लेकिन वे कारण सभी वास्तविक महत्वपूर्ण कारकों की उपेक्षा करते हैं जो उचित डिजाइन को प्रेरित करते हैं।

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

  2. ग्राहक प्रतिक्रिया - आप चाहते हैं कि आपके ग्राहक आपके ऐप पर सकारात्मक प्रतिक्रिया दें। उन्हें इसका उपयोग करने का आनंद लेना चाहिए। यहां तक ​​कि अगर यह काम के लिए पेरोल ऐप है, तो इसे खोलना और उसमें घड़ी डालना उनके लिए खुशी की बात होनी चाहिए। ऐप को आपके ग्राहकों का समय बचाना चाहिए और विकल्पों पर निराशा कम करनी चाहिए। (ऐसे ऐप्स जो नाराज उपयोगकर्ता आपके ऐप के खिलाफ आक्रोश पैदा करते हैं जो आपके ब्रांड के खिलाफ आक्रोश में बढ़ता है।)

  3. ग्राहक रूपांतरण - आप चाहते हैं कि आपके ग्राहक ब्राउज़ करने से लेकर बातचीत करने तक जल्दी और आसानी से सक्षम हों। यह किसी भी ऐप का अंतिम लक्ष्य है, छापों को राजस्व में बदलना। (वे ऐप जो राजस्व उत्पन्न नहीं करते हैं, आपके समय का निर्माण व्यावसायिक दृष्टिकोण से किया जाता है।)

खराब तरीके से डिज़ाइन किया गया UI ग्राहक की व्यस्तता और प्रतिक्रिया को कम कर देता है जिसके परिणामस्वरूप अंततः कम राजस्व प्राप्त होता है। मोबाइल केंद्रित दुनिया में (और विशेष रूप से चित्र / परिदृश्य प्रदर्शन मोड के विषय पर), यह बताता है कि उत्तरदायी वेब डिज़ाइन इतना बड़ा सौदा क्यों है। वॉलमार्ट कनाडा ने नवंबर 2013 में अपनी वेबसाइट पर उत्तरदायी डिजाइन पेश किया और ग्राहक रूपांतरण में 20% की वृद्धि देखी । IOS उपकरणों का उपयोग करने वाले ग्राहकों से ओ'नील क्लोथिंग ने उत्तरदायी वेब डिज़ाइन और राजस्व को लागू किया , Android उपकरणों के साथ ग्राहकों से 101.25% और 591.42% की वृद्धि हुई

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

अपने स्क्रीन ओरिएंटेशन को लॉक करना UI डिज़ाइन है जो कि डू-लूप को लागू करने के बराबर है। क्या तुम सच में हो? यकीन है कि आप इसे उस तरह से करना चाहते हैं, या वहाँ एक बेहतर विकल्प है?

अपने एप्लिकेशन को एकल प्रदर्शन मोड में बाध्य न करें। इसे उत्तरदायी बनाने के लिए अतिरिक्त समय और प्रयास का निवेश करें।


2
मैं समझता हूं और आपके साथ इस बात से सहमत हूं कि खराब यूआई डिजाइन किया गया है। लेकिन यह इस तथ्य को नहीं बदलता है कि आप ऐसा करने के लिए आवश्यक हैं, और फिर भी रूपरेखा में सामान्य रूप से उन क्षमताओं को होना चाहिए। आपको कभी नहीं पता कि भविष्य के ऐप्स क्या होंगे और क्या करने की आवश्यकता है, इसलिए सवाल अभी भी वैध है।
ज़ुल्लाह

1
तुम गलत नहीं हो। मुझे लगता है कि मेरा जवाब आंशिक रूप से निराशा से भरा था, मेरे पास कुछ ऐप हैं जो इसे अनावश्यक रूप से करते हैं और यह पूरी तरह से अनुभव को बर्बाद कर देता है। मैं कहूंगा कि डिस्प्ले मोड को लॉक करने के लिए वैध मामलों की संख्या असीम रूप से छोटी है (और अभी भी करने योग्य और बेहतर, बजट के भीतर नहीं)। यह अन्य समस्याओं को ध्यान में लाता है; कोडिंग आसान होने के साथ ही इसमें बहुत सारे शौकिया डेवलपर्स ऐप्स लिख रहे हैं क्योंकि वे कोड जानते हैं, लेकिन यूआई या डिज़ाइन, या यहां तक ​​कि बुनियादी सर्वोत्तम प्रथाओं को सीखने के बिना भी (जावा ऐप जो कि \ AppData - EWWWW में इंस्टॉल होते हैं)।
थॉमस

1
मैं एक वीआर ऐप बना रहा हूं। उनके जादू करने के लिए चश्मे के लिए अभिविन्यास अवश्य होना चाहिए। यह UI का एक उदाहरण है जिसे पोर्ट्रेट और लैंडस्केप दोनों में काम करने के लिए डिज़ाइन नहीं किया जा सकता है। खेलों को एक निश्चित अभिविन्यास के लिए मजबूर करना पड़ सकता है। मुझे यकीन है कि वैध मामलों के टन हैं।
रसलानोव

1
जबकि StackExchange विशिष्ट सवालों के जवाब देने के लिए मौजूद है, उत्तर आम तौर पर यथासंभव लागू करने के लिए लिखे जाने चाहिए ताकि वे उत्तर दूसरों के लिए उपयोगी हों । विकास सिर्फ लिखने के कोड से बहुत अधिक है और इसका कारण यह है कि दुनिया में बहुत सारे कबाड़ अनुप्रयोग हैं क्योंकि बहुत सारे डेवलपर्स भूल जाते हैं - या कभी नहीं सीखते हैं - यह महत्वपूर्ण सिद्धांत है। मैं व्यक्तिगत रूप से यह जोड़ूंगा कि यदि आप वीआर गलत कर रहे फोन पर वीआर कर रहे हैं - लेकिन लागत ने वीआर की मांग को उन प्लेटफार्मों पर धकेल दिया है जो कभी भी इसका समर्थन नहीं करना चाहिए।
थॉमस

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