स्क्रीन रोटेशन के बाद पाठ दृश्य की पुनर्स्थापना स्थिति?


104

मेरे ऐप में मेरे पास TextViewऔर है EditText। इसमें दोनों का डेटा है। जब स्क्रीन ओरिएंटेशन डेटा को EditTextअवशेषों में बदलता है, लेकिन TextViewडेटा साफ़ हो जाता है।

क्या कोई मुझे डेटा को बनाए रखने का तरीका खोजने में TextViewभी मदद कर सकता है?

जवाबों:


221

यदि आप TextViewअपनी स्थिति को बचाने के लिए अपने बल को जोड़ना चाहते हैं, तो आपको freezesTextविशेषता जोड़ना होगा :

<TextView 
     ... 
     android:freezesText="true" />

प्रलेखन पर से freezesText:

यदि सेट किया जाता है, तो पाठ दृश्य में मेटा-डेटा जैसे कि वर्तमान कर्सर स्थिति के अलावा इसके जमे हुए icicle के अंदर अपना वर्तमान पूर्ण पाठ शामिल होगा। डिफ़ॉल्ट रूप से यह अक्षम है; यह तब उपयोगी हो सकता है जब किसी सामग्री प्रदाता जैसे किसी स्थायी स्थान पर पाठ दृश्य की सामग्री संग्रहीत न हो


13
अन्य विशेषताओं (पाठ चयन, कर्सर की स्थिति, आदि) की तरह पाठ को डिफ़ॉल्ट रूप से 'फ्रोजन / सेव' क्यों नहीं किया जाता है? दूसरे शब्दों में, कोई व्यक्ति वास्तव में यह पसंद करेगा कि पाठ सहेजा न जाए ?
गौतम

3
@ गौतम मेरा अनुमान होगा कि अक्सर टेक्स्ट व्यू एक्सएमएल में स्टोर किए गए स्टैटिक स्ट्रिंग्स से बनाए जाते हैं, ऐसे में यह सिस्टम के लिए मूल्यों को याद रखने के लिए बेमानी है।
anderspitman

3
दरअसल, एक बार जब आप EditText या TextView देते हैं, तो एक स्क्रीन रोटेशन इवेंट के दौरान एक वैल्यू बनी रहेगी।
डॉक्टर फॉक्स

7
@ जजेश - दुर्भाग्य से यह टेक्स्टव्यू के लिए कम से कम कुछ उपकरणों (जेलीबीन) पर नहीं है
Bö macht Blau

1
मेरे लिए काम नहीं करता है, कम से कम एक API 17 डिवाइस पर नहीं
Ab

28

अभिविन्यास परिवर्तन पर डेटा बनाए रखने के लिए आपको दो तरीकों को लागू करने की आवश्यकता है:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

5
जब OnCreate में एक ही बंडल उपलब्ध हो तो onRestoreInstanceState का उपयोग क्यों करें?
slott

4
@slott इस दस्तावेज़ की जाँच करें। developer.android.com/training/basics/activity-lifecycle/… यह अनुमान है, लेकिन मुझे संदेह है कि यह सिस्टम पर नज़र रखता है अगर यह एक नई गतिविधि बना रहा है, या किसी पुराने को फिर से बना रहा है। onRestorySavedInstance को केवल दुर्लभ परिस्थितियों में कहा जाता है - स्मृति परिवर्तन के कारण कॉन्फ़िगरेशन परिवर्तन और गतिविधि विनाश।
Gusdor

6

1) एक आईडी के साथ सभी दृश्य अपने राज्य को नहीं बचाते हैं। एंड्रॉइड विजेट, एक आईडी के साथ, जिसका राज्य उपयोगकर्ता द्वारा बदला जा सकता है, एक नरम मार पर अपने राज्य को बचाने के लिए दिखाई देते हैं। इसलिए EditText अपने राज्य को बचाता है, लेकिन TextView एक नरम मार पर अपने राज्य को नहीं बचाता है।

"AFAIK, एंड्रॉइड केवल उन चीज़ों के लिए राज्य को बचाता है जो बदलने की उम्मीद कर रहे हैं। यही कारण है कि यह टेक्स्ट को एक EditText (जो एक उपयोगकर्ता को बदलने की संभावना है) में बचाता है और शायद एक TextView (जो आम तौर पर स्थिर रहता है) के लिए राज्य को नहीं बचाता है ) "

मार्क एम

तो आप onSaveInstanceState में टेक्स्टव्यू की स्थिति को बचाने का विकल्प चुन सकते हैं और आप ऑनक्रिएट में टेक्स्टव्यू की स्थिति को पुनर्स्थापित करना चुन सकते हैं।

2) सबसे अच्छा अभ्यास "आंतरिक" गैर-दृश्य उदाहरण स्थिति को बचाने के लिए है, भले ही आप घोषणा करें

android:configChanges= "orientation|keyboardHidden" 

डॉक्स से:

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

जेएएल


6

एंड्रॉइड आपके लिए उस तरह का सामान नहीं संभालता है। आपके पास सभी डेटा को मैन्युअल रूप से सहेजना है।

मूल्यों को बचाने के लिए आप किसी गतिविधि में उपयोग कर सकते हैं

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

और सहेजे गए ऑब्जेक्ट्स को लोड करने के लिए किसी गतिविधि की ऑनक्रीट पद्धति में कुछ इस तरह का उपयोग करें

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

आप किसी गतिविधि के लिए अक्षम अभिविन्यास परिवर्तन भी चुन सकते हैं

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

Android.support.v4.app.fragmentActivity में onRetainNonConfigurationInstance () को ओवरराइड नहीं कर सकता; ओवरराइड विधि अंतिम है !!
आकाश दुबे

1

अपनी गतिविधि / गतिविधियों में इसे जोड़कर अभिविन्यास परिवर्तन व्यवहार को ओवरराइड करने के लिए AndroidManifest.xml में अपनी गतिविधियों को संशोधित करें:

android:configChanges="orientation|keyboardHidden"

यह कुछ इस तरह दिखना चाहिए:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

27
सामान्य तौर पर, इस दृष्टिकोण को प्रलेखन द्वारा अनुशंसित नहीं किया जाता है : "इस विशेषता का उपयोग करने से बचा जाना चाहिए और केवल अंतिम उपाय के रूप में उपयोग किया जाना चाहिए। कृपया रनटाइम परिवर्तन को संभालना पढ़ें ..."
idbrii

1

AndroidManifest.xml करने के लिए इन जोड़े
के स्थान पर अपनी गतिविधि का नाम रखो ACTIVITY_NAME

<activity android:name="Activity_Name"
        android:screenOrientation="sensor"
        ...
        android:configChanges="orientation|keyboardHidden|screenSize">

यह वैल्यू चेंजिंग टेक्स्टफिल्ड के साथ भी काम करेगा।


1

बस जोड़ दो

android:configChanges="orientation|screenSize"

AndroidManifest.xml में अपनी गतिविधि के लिए।


-2

जब कॉन्फ़िगरेशन बदलता है तो एंड्रॉइड डिफ़ॉल्ट रूप से आपकी गतिविधि को पुनरारंभ करता है। इसे बदलने के लिए आपको onConfigurationChanged()विधि को ओवरराइड करना चाहिए । साथ ही, आपको जोड़ना चाहिएandroid:configChanges अपनी मैनिफ़ेस्ट फ़ाइल में ।

आप यहाँ और पढ़ सकते हैं ।


-7

मैंने भी इस्तेमाल किया

android:configChanges="orientation"

और यह काम नहीं किया।

लेकिन तब मुझे एक उपाय मिला।

सत्यापित करें कि क्या आपके पास अपने मैनिस्ट में सही लाइन है:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />

सुनिश्चित करें कि यह कुछ नहीं पढ़ता है

<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`

मेरे पास पहले स्थान पर यह दूसरा तरीका था लेकिन जब मैंने इसे सही किया तो राज्य संरक्षित हो गया।


1
यह बिलकुल अलग बात है। लक्ष्य एसडीके अपने ऐप को एंड्रॉइड ओएस की अधिकांश श्रेणियों के साथ संगत बनाना है। यह एक जवाब नहीं है, कुछ तरीकों से यह आपके मामले में काम कर सकता है लेकिन यह एक उचित समाधान नहीं है।
रोहन कंडवाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.