2009-02-25 13 views
19

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

क्या कोई मुझे बता सकता है कि क्या गलत हो सकता है।

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

संपादित करें
मैंने राज्य के मुद्दे को हल नहीं किया है। लेकिन मुझे एक और समस्या का सामना करना पड़ा कि अभिविन्यास बदलने के बाद स्क्रीन पर कोई भी बटन काम नहीं करता है। बटन प्रेस पर, मुझे यह चेतावनी LogCat

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0 

कृपया यह सहायता प्राप्त करें।

उत्तर

23

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

This अभिविन्यास ट्यूटोरियल की एक श्रृंखला और this first one पर विशेष रूप से आपको यह समझने में मदद करनी चाहिए कि क्या हो रहा है और वर्तमान स्थिति को सफलतापूर्वक कैसे बनाए रखा जाए।

अपडेट: SO Activity restart on rotation Android पर एक पोस्ट भी है जो लगभग एक ही चीज़ से संबंधित है।

अनुवर्ती प्रश्न के लिए संपादित करें:

आप अपनी क्लिक संचालकों ऑरिएंटेशन बदलने फिर से संलग्न किया था?

+0

अंतिम प्रश्न क्यों? श्रोताओं को दोबारा जोड़ना महत्वपूर्ण है? कृपया मुझे बताओ। :) –

+0

हां, क्योंकि यदि आप उन्हें फिर से संलग्न नहीं करते हैं तो भी वे पुराने बटन से जुड़े रहेंगे जो अब मौजूद नहीं हैं। –

+1

+1 धन्यवाद! मैं बस पिछले घंटे के लिए इस त्रुटि के साथ फंस गया। मैं वास्तव में एंड्रॉइड विकास से घृणा करने आया हूं! यह छोटी चीजों को जटिल बनाता है। –

5

इस प्रयास करें:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(SOME_KEY, "blah blah blah"); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    somevalue = savedInstanceState.getString(SOME_KEY); 
    ... 
} 
3

यह संभव एक विशेषता एंड्रॉयड घोषित करने के लिए: "अभिविन्यास" के मूल्य के साथ configChanges, इस को पुन: प्रारंभ होने से गतिविधि नहीं कर पाएगा। इसके बजाए, गतिविधि चल रही है और इसकी ऑन कॉन्फ़िगरेशन चेंज() विधि कहा जाता है। अपने प्रकट file..in में

+0

यह गतिविधि टैग – sami

8

लिखें इस आप चाहते हैं जो गतिविधि this--

android:configChanges="orientation|keyboardHidden" 

संपादित: versions--

android:configChanges="orientation|keyboardHidden|screenSize" 

निश्चित रूप से कहीं भी होगी नए एपीआई के लिए यह एक उपयोग काम ..

+0

में जोड़ें यह एमुलेटर में काम किया गया था। लेकिन असली डिवाइस में काम नहीं किया। – enadun

+0

यह वास्तविक डिवाइस पर भी काम करेगा। सुनिश्चित करें कि आपने इसे उस गतिविधि पर जोड़ा है जिस पर समस्या होती है। – Hulk

+0

काम नहीं किया !!!! –

1

अपने प्रकट में < android:configChanges="orientation|keyboardHidden"/> घोषित करें। यह आपको ओरिएंटेशन/कीबोर्ड दृश्यता के परिवर्तन को प्रबंधित करने की अनुमति देता है। बेशक, आपको इसे प्रबंधित करने के लिए कॉलबैक विधि को ओवरराइड करने की आवश्यकता नहीं है।

0

हाय मुझे भी इस समस्या का सामना करना पड़ा। क्या मेरे लिए यह तय किया गया था:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putString("Username", mUsername); 
    savedInstanceState.putString("Password", mPassword); 
    savedInstanceState.putString("UserID", mUserID); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

और फिर OnCreate() में:

if (savedInstanceState == null) { 
    Bundle extras = getIntent().getExtras(); 
    if(extras == null) { 
     mUsername = "?"; 
     mPassword = "?"; 
     mUserID = "?"; 
    } else { 
     mUsername = extras.getString("Username"); 
     mPassword = extras.getString("Password"); 
     mUserID = extras.getString("UserID"); 
    } 
} else { 
    mUsername = (String) savedInstanceState.getSerializable("Username"); 
    mPassword = (String) savedInstanceState.getSerializable("Password"); 
    mUserID = (String) savedInstanceState.getSerializable("UserID"); 
} 

तो आप यकीन है कि वस्तुओं अशक्त नहीं हैं हो सकता है।