2011-01-15 19 views
19

मैंने अभिविन्यास मूल्य प्राप्त करने के लिए getOrientation() को आजमाया लेकिन यह हमेशा 0 देता है!एंड्रॉइड स्क्रीन अभिविन्यास

+7

डिवाइस को पहले घूर्णन करने का प्रयास करें। – noelicus

+0

प्रश्न के रूप में तीसरे पक्ष के शीर्षक को वापस रोल किया गया (और इससे भी ज्यादा इसका जवाब है) विशेष रूप से एक विधि के बजाय सामान्य समस्या के रूप में चिंता अभिविन्यास। –

उत्तर

5

getOrientation() बहिष्कृत किया गया है। इसके बजाय, getRotation() आज़माएं।

+0

कोई विचार क्यों मिलता है ऑरिएन्टेशन को बहिष्कृत किया जाता है? जहां तक ​​मैं कह सकता हूं, getRotation एक ही चीज़ करता है। –

+1

यदि आपको एपीआई 7 का समर्थन करना होगा, तो आप 'getRotation' का उपयोग नहीं कर सकते हैं, यह एपीआई 8 आगे है। – mxcl

37

आप यदि सामग्री वर्तमान में प्रदर्शित लैंडस्केप मोड या चित्र (संभवतः पूरी तरह से फोन की शारीरिक रोटेशन की स्वतंत्र) में है जानना चाहते हैं आप का उपयोग कर सकते हैं:

getResources().getConfiguration().orientation

Developer Documentation

सार्वजनिक int अभिविन्यास
चूंकि: API स्तर 1

स्क्रीन के कुल मिलाकर अभिविन्यास। ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT, या ORIENTATION_SQUARE में से एक हो सकता है।

+0

अच्छा समाधान जब आपको पुराने ओएस संस्करणों का समर्थन करने की आवश्यकता होती है। लगता है कि 'getOrientation() 'से अधिक विश्वसनीय होना प्रतीत होता है। – azdev

+0

अभी तक, यह एकमात्र समाधान है जिसने मेरे लिए ठीक से काम किया है! –

+0

ऐसा लगता है जैसे getOrientation() हमेशा ORIENTATION_UNDEFINED लौटाता है अगर मैंने गतिविधि लोड करने के बाद स्क्रीन को घुमाया नहीं था। इस तरह से उस समस्या से बचा जाता है। – Keith

46

getOrientation() को बहिष्कृत किया गया है लेकिन यह आपकी समस्या की जड़ नहीं है। यह सच है कि आपको getRotation()के बजाय getOrientation() का उपयोग करना चाहिए, लेकिन यदि आप एंड्रॉइड 2.2 (एपीआई लेवल 8) या उच्चतर को लक्षित कर रहे हैं तो आप इसका उपयोग केवल तभी कर सकते हैं। कुछ लोग और यहां तक ​​कि Googlers कभी-कभी भूल जाते हैं।

उदाहरण के तौर पर, मेरी एचटीसी इच्छा पर एंड्रॉइड 2.2 चल रहा है।

  • 0 (डिफ़ॉल्ट, चित्र),
  • 1 (डिवाइस 90 डिग्री वामावर्त),
  • 3 (डिवाइस 90 डिग्री दक्षिणावर्त: getOrientation() और getRotation() दोनों एक ही मान रिपोर्ट)

यह रिपोर्ट नहीं करता है जब आप इसे "अपने सिर पर" डालते हैं (180 घुमाएं, यह मान 2 होगा)। यह परिणाम संभवतः डिवाइस-विशिष्ट है।

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

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    Display mDisplay = mWindowManager.getDefaultDisplay(); 

    Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation()); 

} 

चेक अपने आपके डिवाइस की स्क्रीन उपकरण सेटिंग में बंद कर दिया गया है, तोसेटिंग> प्रदर्शन> ऑटो: तो फिर मैं इस तरह एक OnCreate() विधि के साथ एक छोटे से परीक्षण कार्यक्रम बनाने के लिए सिफारिश करेंगे स्क्रीन घुमाएं। यदि वह चेकबॉक्स अनचेक किया गया है, तो एंड्रॉइड आपकी गतिविधि में अभिविन्यास परिवर्तन की रिपोर्ट नहीं करेगा। स्पष्ट होने के लिए: यह गतिविधि को पुनरारंभ नहीं करेगा। मेरे मामले में मुझे केवल मिलता है, जैसा आपने वर्णन किया है।

आप अपने कार्यक्रम से जाँच कर सकते हैं अगर आप onCreate()

int sysAutoRotate = 0; 
try { 
     sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION); 
    } catch (SettingNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate); 

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

android:screenOrientation="portrait" 

समान प्रभाव, लेकिन इस बार केवल आपकी गतिविधि के लिए। यदि आपने छोटा परीक्षण कार्यक्रम बनाया है तो यह संभावना समाप्त हो गई होगी (यही कारण है कि मैं इसकी अनुशंसा करता हूं)।

टिप्पणी: हां संपूर्ण अभिविन्यास/रोटेशन विषय वास्तव में एक "दिलचस्प" विषय है। चीजों को आज़माएं, Log.d(), प्रयोग, सीखें।

+0

केवल 26 वोट? यह वास्तव में उपयोगी है! – Sonhja

1
/* First, get the Display from the WindowManager */ 
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

/* Now we can retrieve all display-related infos */ 
int width = display.getWidth(); 
int height = display.getHeight(); 
int orientation = display.getOrientation(); 
1

मुझे लगता है कि आपको दो अलग-अलग लेआउट बनाने और विभिन्न अभिविन्यास पर विभिन्न लेआउट को बढ़ाने की आवश्यकता है। मैं आपको एक नमूना कोड दे रहा हूं जो मेरे लिए ठीक काम कर रहा है। "संदर्भ" कस्टम एडाप्टर के मामले में आप अपनी गतिविधि से गुजर सकते हैं। आप कस्टम एडाप्टर का उपयोग कर रहे हैं तो आप इस कोड की कोशिश कर सकते हैं:

@Override 
public View getView(final int position, 
        View convertView, 
        ViewGroup parent) 
{ 
    View rowView = convertView; 
    ViewHolder holder = null; 
    int i = context.getResources().getConfiguration().orientation; 

    if (rowView == null) { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (i == Configuration.ORIENTATION_PORTRAIT) { 
      rowView = inflater.inflate(R.layout.protrait_layout, null, false); 
     } else { 
      rowView = inflater.inflate(R.layout.landscape_layout, null, false); 
     } 

     holder = new ViewHolder(); 
     holder.button = (Button) rowView.findViewById(R.id.button1); 
     rowView.setTag(holder); 

    } else { 
     holder = (ViewHolder) rowView.getTag(); 
    } 
    return rowView; 
} 

अन्य बुद्धिमान आप सीधे अपने कोड में दो अलग-अलग लेआउट सेट

int i = context.getResources().getConfiguration().orientation; 

     if (i == Configuration.ORIENTATION_PORTRAIT) { 
        ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name); 
     } else { 
        ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name); 
     } 
4

पदावनत तरीकों के उपयोग से बचने के उपयोग करने के लिए एंड्रॉयड विन्यास कर सकते हैं कक्षा here मिली। यह एपीआई lvl 1 के बाद से काम करता है और अभी भी नवीनतम एंड्रॉइड उपकरणों पर काम करता है। (बहिष्कृत नहीं)।

Configuration config = getResources().getConfiguration(); 
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) 
{ 
    setContentView(R.layout.portraitStart); 
} 
else 
{ 
    setContentView(R.layout.landscapeStart); 
} 

luck- आशा की बेस्ट इस जवाब जो कोई भी इसे में चलाता है मदद करता है:

के रूप में और उदाहरण निम्नलिखित कोड का टुकड़ा पर विचार करें।

+1

आप मैन्युअल रूप से कोड के माध्यम से क्यों स्विच करेंगे? लेआउट विन्यास इसके लिए हैं।/res/लेआउट और/res/लेआउट-भूमि। – afollestad

2

आप उपयोग करना चाहिए:

getResources().getConfiguration().orientation 

यह ORIENTATION_LANDSCAPE में से एक, ORIENTATION_PORTRAIT हो सकता है।

http://developer.android.com/reference/android/content/res/Configuration.html#orientation

+0

आप लैंडस्केप बाएं/दाएं जैसे विस्तृत विवरण प्राप्त कैसे करते हैं? – Mark13426

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