2015-02-18 14 views
7

documentation for the Android manifest में, वहाँ screenOrientation निर्दिष्ट करने के लिए कई अलग अलग तरीके हैं मैं userLandscape कैसे निर्दिष्ट कर सकता हूं, लेकिन एंड्रॉइड के पुराने संस्करणों पर, इसेपर फ़ॉलबैक करें, और यहां तक ​​कि पुराने संस्करणों पर भी landscape पर आते हैं? मैं दस्तावेज में ऐसा करने के लिए नहीं मिला।प्रकट फ़ॉलबैक

उत्तर

8

मुझे नहीं लगता कि मैनिफेस्ट में फ़ॉलबैक तंत्र को लागू करने का एक तरीका है।

मैं सुझाव दूंगा कि आप मेनिफेस्ट में {उपयोगकर्ता लैंडस्केप, सेंसर लैंडस्केप, लैंडस्केप} में से एक निर्दिष्ट करें। फिर, रनटाइम पर संस्करण की जांच करें और सुधार करें।

कहें, आप मेनिफेस्ट में android:screenOrientation="userLandscape" के साथ जाने का निर्णय लेते हैं।

में अपनी गतिविधि के onCreate(Bundle), सामग्री सेट करने से पहले:

int sdkInt = Build.VERSION.SDK_INT; 

// if we're running on some API level within [9, 18), use `sensorLandscape` 
if (sdkInt >= Build.VERSION_CODES.GINGERBREAD /* 9 */ 
     && sdkInt < Build.VERSION_CODES.JELLY_BEAN_MR2 /* 18 */) { 
    setRequestedOrientation(
      ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
} else if (sdkInt < Build.VERSION_CODES.GINGERBREAD /* 9 */) { 
    setRequestedOrientation(
      ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 

// API 18 or above - handled in manifest 

setContentView(R.layout.whatever); 

आशा है कि किसी को इस से एक बेहतर समाधान के साथ आता है। यह क्रूर बल लगता है।

संपादित करें:

एक अलग दृष्टिकोण की कोशिश की - जो मैं जानता हूँ से (और मैं गलत यहाँ हो सकता है), enums ऐसे userLandscape के रूप में, sensorLandscape आदि मूल्यों को बदल नहीं होंगे। के रूप में वे वर्तमान में खड़े:

<attr name="screenOrientation"> 
    <enum name="unspecified" value="-1" /> 
    <enum name="landscape" value="0" /> 
    <enum name="portrait" value="1" /> 
    <enum name="user" value="2" /> 
    <enum name="behind" value="3" /> 
    <enum name="sensor" value="4" /> 
    <enum name="nosensor" value="5" /> 
    <enum name="sensorLandscape" value="6" /> 
    <enum name="sensorPortrait" value="7" /> 
    <enum name="reverseLandscape" value="8" /> 
    <enum name="reversePortrait" value="9" /> 
    <enum name="fullSensor" value="10" /> 
    <enum name="userLandscape" value="11" /> 
    <enum name="userPortrait" value="12" /> 
    <enum name="fullUser" value="13" /> 
    <enum name="locked" value="14" /> 
</attr> 

तो, परिभाषित करने के लिए यदि आप थे एक integer जैसे:

<!-- `0` for `landscape` -- defined in values/integers.xml --> 
<integer name="customScreenOrientation">0</integer> 

<!-- `6` for `sensorLandscape` -- defined in values-v9/integers.xml --> 
<integer name="customScreenOrientation">6</integer> 

<!-- `11` for `userLandscape` -- defined in values-v18/integers.xml --> 
<integer name="customScreenOrientation">11</integer> 

फिर आप @integer/customScreenOrientation अपनी गतिविधि के टैग में android:screenOrientation के लिए मूल्य के रूप में इस्तेमाल कर सकते हैं।

सबसे अच्छा यह हैक कहने की जरूरत नहीं है। अगर कोई screenOrientation के लिए एनम मानों की स्थिर स्थिति की पुष्टि कर सकता है, तो यह एक व्यवहार्य कामकाज हो सकता है - कई गतिविधियों में मेरे पिछले सुझाव से कोड शामिल करना बेहतर है।

फिर भी एक और संपादित करें:

दूसरा दृष्टिकोण कि मैंने पहले बताया पर सुधार किया जा सकता है:

इसके बजाय कई integers.xml फ़ाइलों के

, 3 styles.xml फ़ाइलों को बनाने के। मुझे लगता है कि आपके पास पहले से ही एक है - values/styles.xmlvalues-v9/styles.xml & values-v18/styles.xml बनाएं।

<!-- values/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">landscape</item> 
</style> 

<!-- values-v9/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">sensorLandscape</item> 
</style> 

<!-- values-v18/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">userLandscape</item> 
</style> 

इस के बाद, values/integers.xml (एक फ़ाइल) बना सकते हैं और एक पूर्णांक customScreenOrientation को परिभाषित: से अधिक इस दृष्टिकोण का लाभ

<activity 
    .... 
    android:theme="@style/AppTheme" 
    android:screenOrientation="@integer/customScreenOrientation"/> 

:

<integer name="customScreenOrientation">?android:attr/screenOrientation</integer> 

आप गतिविधि टैग की तरह दिखाई देगा दूसरा यह है कि हम कठोर कोडित मूल्यों के स्थान पर enums का उपयोग करने के लिए मिलता है। फिर, इन दो दृष्टिकोण समकक्ष हैं यदि पत्थर में enum-values ​​सेट हैं। यदि वे बदलते हैं, तो दूसरा दृष्टिकोण असफल हो जाएगा जबकि तीसरा एक चल रहा है।

+0

यह काम करता है। मुझे एक और अधिक सुरुचिपूर्ण समाधान देखने में दिलचस्पी होगी, लेकिन शायद कोई नहीं है। – Tenfour04

+0

@ Tenfour04 मैं इसके साथ कुछ और खेल रहा था और एक और कामकाज पाया - यह मेरी राय में सुरुचिपूर्ण नहीं है, लेकिन कम कोड के साथ समाधान प्रदान करता है। – Vikram

+0

@ Tenfour04 फ़ॉलबैक तंत्र को लागू करने का एक और (आखिरी उम्मीद है) जोड़ा गया। – Vikram

संबंधित मुद्दे