2012-10-18 19 views
8

मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं जो केवल फोन के लैंडस्केप स्क्रीन पर फ़िट नहीं होने वाले लेआउट के कारण पोर्ट्रेट मोड में चलाना चाहिए। टैबलेट और नेटबुक पर, हालांकि, मैं चाहता हूं कि ऐप केवल लैंडस्केप मोड में ही चलाए।setRequestedOrentation ProgressDialog को क्रैश करने से पहले

अब मैंने यह जांचने की कोशिश की है कि ऐप टैबलेट डिवाइस पर चल रहा है और setRequestedOrientation के माध्यम से संबंधित अनुरोधित अभिविन्यास सेट कर रहा है।

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

Logcat का कहना है:

10-18 21:15:30.698: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window [email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:31.888: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window [email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:599) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:336) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151) 

मैं इस दुर्घटना को रोकने के लिए क्या कर सकता है? किसी भी मदद की अत्यधिक सराहना की जाएगी।

संपादित करें: चूंकि मैं इसे हल करने में सक्षम नहीं था, इसलिए मैं अंततः अपने लेआउट को संपादित करने में कामयाब रहा ताकि अब यह पोर्ट्रेट और लैंडस्केप मोड में उपयोग की अनुमति दे।

उत्तर

11

क्या आपके पास कोई स्रोत कोड है जो आप दिखा सकते हैं? इससे समस्या की पहचान करने में मदद मिल सकती है।

मुझे वास्तव में एक ही समस्या थी। लेकिन यह केवल मेरी कुछ गतिविधियों के लिए हो रहा था।

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

तो, मेरे पास ऐसा कोड था जो इस तरह दिखता था।

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     setContentView(R.layout.displayscreen); 

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

देखें कि क्या हो रहा था यह है कि दृश्य विंडो प्रबंधक को सही ढंग से संलग्न नहीं किया गया था। तो मैंने फैसला किया कि शायद यह करने के लिए नायक शायद सबसे अच्छा स्थान नहीं था।

इसके बजाय मैंने इसे फिर से शुरू करने के लिए जोड़ा और यह काम करता है। इसलिए जैसा:

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

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

दुर्भाग्य से यह भी कारण बनता है गतिविधि अभी भी नष्ट कर दिया और निर्मित करने के लिए। ऑनक्रेट और ऑनर्यूम को दो बार कॉल करना ... अच्छा नहीं है?

तो इस समस्या को ठीक करने के लिए। आपको इसे अपनी गतिविधि के लिए अपने एंड्रॉइड मेनिफेस्ट में जोड़ना होगा।

android:configChanges="keyboardHidden|orientation" 

एक उदाहरण:

<activity 
    android:name="com.Test.Info.DisplayInfo" 
    android:configChanges="keyboardHidden|orientation" 
    android:label="@string/info"> 
</activity> 

इस कोड को नष्ट/चक्र पुन: बनाने से रोकता है।

उम्मीद है कि इससे मदद मिलती है!

चीयर्स

+1

इतने लंबे उत्तर लिखने के लिए धन्यवाद, लेकिन दुर्भाग्य से यह मेरी समस्या का समाधान नहीं किया। –

+0

कोई समस्या नहीं है। क्षमा करें यह आपकी मदद नहीं करता है। अगली बार यदि आप कुछ स्रोत कोड जोड़ते हैं, तो यह आपके विशिष्ट मुद्दे को ट्रैक करने में मदद करेगा। मुझे एक ही समस्या थी, और यह मेरे विशिष्ट मुद्दे के लिए काम किया। खुशी है कि आप इसे काम कर रहा है। – Dave

+1

धन्यवाद, आपके उत्तर ने मुझे डेव बचाया! असल में, आपको सिर्फ 'android: configChanges = "ओरिएंटेशन" को मैनिफेस्ट में सेट करना होगा और' onRreate() '; –

9

यदि आप

setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); 

अस्थायी रूप से लॉक करने के लिए उपयोग करते हैं, और

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

स्क्रीन रोटेशन अनलॉक करने के लिए, हो सकता है आपको निम्न problem में फंस गयी।

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

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