हमेशा लैंडस्केप मोड का उपयोग करने के लिए एंड्रॉइड गतिविधि को बल दें


144

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

जवाबों:


188

AndroidManifest.xml ( लिंक ) को देखते हुए , लाइन 9 पर:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

यह पंक्ति screenOrientationपरिदृश्य को निर्दिष्ट करती है , लेकिन लेखक किसी भी स्क्रीन ओरिएंटेशन परिवर्तनों को ओवरराइड करने में आगे जाता है configChanges="orientation|keyboardHidden"। यह VncCanvasActivity.java में एक ओवरराइड फ़ंक्शन को इंगित करता है।

यदि आप VncCanvasActivity को देखते हैं, तो लाइन 109 अतिव्यापी कार्य है:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

लेखक ने विशेष रूप से किसी भी कीबोर्ड या ओरिएंटेशन परिवर्तनों को अनदेखा करने के लिए एक टिप्पणी रखी।


यदि आप इसे बदलना चाहते हैं, तो आप ऊपर दिखाए गए AndroidManifest.xml फ़ाइल पर वापस जा सकते हैं, और लाइन को इसमें बदल सकते हैं:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

उपयोगकर्ता द्वारा डिवाइस को घुमाए जाने पर यह पोर्ट्रेट से परिदृश्य में स्विच करने के लिए प्रोग्राम को बदलना चाहिए।

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


3
वास्तव में configChangesविशेषता की आवश्यकता क्यों है ? यह मेरे गैर-कीबोर्ड फोन पर इसके बिना काम करने लगता है ... किन स्थितियों में अभिविन्यास बदल जाएगा यदि आपके पास है screenOrientation="landscape"लेकिन छोड़ दें configChanges?
टिम्मम


सिस्टम छवि जैसी अंतर्निहित गतिविधि को केवल परिदृश्य में पुस्तकालय का चयन करने के लिए कैसे बाध्य करें या केवल चित्र?
जैकी

118

आप अपने जावा कोड में भी वही डेटा सेट कर सकते हैं।

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

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


@ योरग हमेशा नहीं। एंड्रॉइड डॉक्स से:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
चैतन्य

40

मेरे में OnCreate(Bundle), मैं आमतौर पर निम्नलिखित कार्य करता हूं:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
अन्य उत्तरों में प्रकट विधि काम नहीं करती थी, लेकिन @anwarma ने आपकी
Anup

31

आप एक गतिविधि के अभिविन्यास को प्रकट में निर्दिष्ट कर सकते हैं। देखें यहाँ

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

मेनिफेस्ट में:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

आपकी गतिविधि में:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

निम्नलिखित कोड है जिसे मैंने लैंडस्केप मोड में सभी गतिविधि प्रदर्शित करने के लिए उपयोग किया है:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

2
"अभिविन्यास" यदि आपका एप्लिकेशन एपीआई स्तर 13 या उच्चतर को लक्षित करता है, तो आपको "स्क्रीनसाइज" भी घोषित करना चाहिए
मीना

7

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

android:screenOrientation="landscape"

5

यह Xamarin के लिए काम करता है। OnCreate () में

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

4

बस!! इस फिक्स का लंबे समय से इंतजार है।

मेरे पास एक पुरानी एंड्रॉइड समस्या है जो आवश्यक (प्रोग्रामेटिक रूप से) लैंडस्केप मोड को डबल-स्टार्ट करने के बारे में है: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

अब एंड्रॉइड स्टार्ट पर लैंडस्केप मोड बनाते हैं।


3

अर्सलान, आप अभिविन्यास समर्थक को व्याकरणिक रूप से मजबूर क्यों करना चाहते हैं, हालांकि पहले से ही प्रकट होने का एक तरीका है <activity android:name=".youractivityName" android:screenOrientation="portrait" />


IM पूछने वाले को नहीं, लेकिन शायद वह प्रोग्रामिक रूप से मजबूर करना चाहता है क्योंकि वह इसे एक निश्चित समय पर लागू करना चाहता है?
हमजा मलिक

1

इसे कोड में करना IMO गलत है और इससे भी ज्यादा अगर आप इसे onCreate में डालते हैं। इसे प्रकट में करें और "सिस्टम" ऐप के स्टार्टअप से अभिविन्यास को जानता है। और इस प्रकार का मेटा या शीर्ष स्तर "मार्गदर्शन" प्रकट में होना चाहिए। यदि आप इसे अपने आप को साबित करना चाहते हैं तो गतिविधि की शुरुआत में एक ब्रेक सेट करें। यदि आप इसे कोड में करते हैं तो इसे दो बार कहा जाएगा: यह पोर्ट्रेट मोड में शुरू होता है, फिर लैंडस्केप में बदल जाता है। यदि आप इसे प्रकट में करते हैं तो ऐसा नहीं होता है।


1
मैं असहमत हूं। मैनिफ़ेस्ट के माध्यम से कोड के विपरीत कुछ भी करना हमेशा से मेरी पसंदीदा पद्धति है। एकल जिम्मेदारी सिद्धांत के आधार पर प्रकट केवल आवेदन स्तर के गुणों, अनुमतियों और एपीआई बाइंडिंग से संबंधित होना चाहिए। मैं वास्तव में एक एप्लिकेशन मेनिफ़ेस्ट में मौजूद <गतिविधि> टैग से असहमत हूं और इसलिए मैंने इसे वहां कभी नहीं रखा (और यह ठीक है)। एक गतिविधि को कैसे प्रस्तुत किया जाता है, जाहिर है एक प्रस्तुति चिंता का विषय है। यह कैसे प्रस्तुत किया जाता है इसके लिए आपकी गतिविधि पूरी तरह से जिम्मेदार होनी चाहिए और इसलिए मैं आमतौर पर सभी प्रस्तुति तर्क को दृश्य / गतिविधि कोड में डाल देता हूं।
ComeIn

0

के लिए एंड्रॉयड 4.0 (आइस क्रीम सैंडविच) और बाद में, मैं के अलावा इन्हें जोड़ने के लिए, की जरूरत landscapeमूल्य।

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

keyboardHidden|orientationपावर बटन दबाने पर केवल मेमोरी लीक और मेरी गतिविधियों के मनोरंजन का उपयोग करना होगा।


खराब अभ्यास चेतावनी! यह परिदृश्य मोड में गतिविधि के लिए मजबूर करने के साथ कुछ नहीं करना है। आप सभी को अपनी गतिविधि की स्थिति के भंडारण और मनोरंजन को लागू करने की आवश्यकता है। यह मूल Android विकास ज्ञान है। इस हैकी फिक्स के साथ हल न करें। गतिविधि को सिस्टम द्वारा बंद किया जा सकता है यदि उसे अधिक मेमोरी की आवश्यकता होती है।
Roel

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

थोड़ा सा क्रोधी संदेश के लिए क्षमा करें, लेकिन मैंने इसका परीक्षण किया है और मैं लैंडस्केप मोड के लिए इन सभी मूल्यों को नहीं देखता हूं। जब आप इन सभी मानों को जोड़ते हैं, तो इसका मतलब है कि आप स्वयं onConfigurationChanged () के बजाय परिवर्तनों को संभालते हैं, इसके बजाय गतिविधि को फिर से शुरू किया जाता है (और आपको इसे लागू करना होगा!) लेकिन अगर आप भूस्खलन के लिए बाध्य करते हैं तो एक रोटेशन नहीं होगा।
Roel

नमस्ते, उनमें से कुछ की शायद जरूरत नहीं है, लेकिन उन सभी को छोड़ने से अजीब रोटेशन के मुद्दे होंगे। मैं अब परीक्षण नहीं कर सकता, लेकिन जब मैं एक ऐसा ऐप विकसित कर रहा था जो हर समय परिदृश्य में होना चाहिए, केवल उपयोग करना orientation|screensizeसभी मामलों में पर्याप्त नहीं था। यह चित्र के लिए वापस आटोमोटिव होगा।
पीटरडक

Google मोबाइल विज्ञापनों और अन्य विज्ञापन एसडीके में भी इन विन्यासों का उपयोग किया जाता है। उस समय मुझे उनसे मिला था।
पीटरडक

0

सेटऑलआउट विधि को कॉल करने से पहले अपने ऑनक्रिएट विधि में ActivInfo (android.content.pm.ActivityInfo) का उपयोग करें।

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

0

केवल
एंड्रॉइड का उपयोग करें : स्क्रीनऑरिएशन = "पोर्ट्रेट" टूल: इग्नोर करें = "लॉक्डऑरिएशनएक्टिविटी"


0

गतिविधि में निम्नलिखित पंक्तियाँ जोड़ें

आपको हर गतिविधि में प्रवेश करना होगा

परिदृश्य के लिए

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

चित्र के लिए

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

यहाँ मुख्यता का उदाहरण है

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

-25

CTRL+F11स्क्रीन को घुमाने के लिए दबाएँ ।


3
वे अब चाहते हैं कि किसी ऐप के डिफ़ॉल्ट ओरिएंटेशन को कैसे सेट किया जाए, न कि स्क्रीन को कैसे घुमाया जा सकता है।
काइल की

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