TextView ekran döndürüldükten sonra durumu geri mi yükleniyor?


104

Uygulamamda TextViewve var EditText. Her ikisinin de içinde veri var. Ekran yönü EditTextkalıntılardaki verileri değiştirdiğinde , ancak TextViewveriler temizlenir.

Biri TextViewde verileri tutmanın bir yolunu bulmama yardım edebilir mi?

Yanıtlar:


221

TextViewDurumunuzu kaydetmeye zorlamak istiyorsanız, freezesTextöznitelik eklemeniz gerekir :

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

Aşağıdaki belgelerden freezesText:

Ayarlanırsa, metin görünümü, mevcut imleç konumu gibi meta verilere ek olarak, mevcut tam metnini dondurulmuş buz sarkıtının içinde içerecektir. Varsayılan olarak bu devre dışıdır; bir metin görünümünün içeriği, içerik sağlayıcı gibi kalıcı bir yerde saklanmadığında yararlı olabilir


13
Metin neden diğer özellikler (metin seçimi, imleç konumu, vb.) Gibi varsayılan olarak 'dondurulmuş / kaydedilmiyor'? Başka bir deyişle, ne senaryo birisi aslında olur tercih metin olduğunu değil kurtardı?
Gautam

3
@Gautam Tahminime göre TextViews genellikle XML'de depolanan statik dizelerden oluşturulur ve bu durumda sistemin değerleri hatırlaması gereksizdir.
anderspitman

3
Aslında, EditText veya TextView'a bir kimlik verdiğinizde, değer bir ekran döndürme olayı sırasında devam edecektir.
DoctorFox

7
@jegesh - ne yazık ki bu (Jellybean) bazı cihazlarda en azından TextView'lar için durum böyle değil
Bö Blau macht

1
En az değil bir API 17 cihazda, benim için çalışmaz
Ab

28

Oryantasyon değişikliğiyle ilgili verileri saklamak için iki yöntemi uygulamanız gerekir:

@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
Aynı paket onCreate'de mevcutken neden onRestoreInstanceState kullanmalı?
slott

4
@slott Bu belgeleri kontrol edin. developer.android.com/training/basics/activity-lifecycle/… Bu bir varsayımdır, ancak bunun sistemin yeni bir aktivite mi yoksa eskisini yeniden mi oluşturduğunu takip etmesinden kaynaklandığından şüpheleniyorum. onRestorySavedInstance yalnızca daha nadir durumlarda çağrılır - bellek sınırlamaları nedeniyle yapılandırma değişiklikleri ve etkinlik bozulması.
Gusdor

6

1) Kimliği olan tüm görünümler durumlarını kaydetmez. Durumu kullanıcı tarafından değiştirilebilen bir kimliğe sahip Android widget'ları, durumlarını bir yumuşak öldürmede kaydediyor gibi görünüyor. Böylece, EditText durumunu kaydeder, ancak TextView durumunu yumuşak öldürmede kaydetmez.

"AFAIK, Android yalnızca değişmesi beklenen şeyler için kaydetme durumunu rahatsız eder. Bu nedenle, metni bir EditText'e (kullanıcının değişmesi muhtemeldir) kaydeder ve belki de bir TextView için durumu kaydetmez (normalde statik kalır ) "

Mark M

Böylece, metin görünümünün durumunu onSaveInstanceState'e kaydetmeyi seçebilir ve metin görünümünün durumunu onCreate'e geri yüklemeyi seçebilirsiniz.

2) En iyi uygulama, beyan etseniz bile "dahili" görüntüleme dışı örnek durumunu kaydetmektir.

android:configChanges= "orientation|keyboardHidden" 

Dokümanlardan:

"Ancak, uygulamanız her zaman önceki durumuna dokunulmadan kapanabilmeli ve yeniden başlayabilmelidir. Yalnızca uygulamanızı yeniden başlatmasını engelleyemeyeceğiniz başka yapılandırma değişiklikleri olduğu için değil, aynı zamanda kullanıcının bir gelen aldığında olduğu gibi olayları işlemek için de telefon görüşmesi ve ardından uygulamanıza geri döner. "

JAL


6

Android bu tür şeyleri sizin için işlemez. Tüm verileri manuel olarak kaydettiniz.

Değerleri kaydetmek için bir aktivitede kullanabilirsiniz

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

ve kaydedilen nesneleri yüklemek için bir etkinliğin oncreate yönteminde buna benzer bir şey kullanın

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

bir etkinlik için yön değişikliğini devre dışı bırakmayı da seçebilirsiniz

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

android.support.v4.app.fragmentActivity'de onRetainNonConfigurationInstance () geçersiz kılınamaz; geçersiz kılınan yöntem nihaidir !!
Akash Dubey

1

Yön değişikliği davranışını geçersiz kılmak için AndroidManifest.xml'deki etkinliklerinizi, bunu etkinliğinize / etkinliklerinize ekleyerek değiştirin:

android:configChanges="orientation|keyboardHidden"

Biraz şuna benzemeli:

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

27
Genel olarak, bu yaklaşım dokümantasyon tarafından tavsiye edilmemektedir : "Bu özelliği kullanmaktan kaçınılmalı ve yalnızca son çare olarak kullanılmalıdır. Lütfen Çalışma Zamanı Değişikliklerini
Ele Alma

1

AndroidManifest.xml bunları ekleyin
yerine Etkinlik Adı koy ACTIVITY_NAME

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

Bu, değer değiştiren TextField ile de çalışacaktır.


1

sadece ekle

android:configChanges="orientation|screenSize"

AndroidManifest.xml'deki Etkinliğinize.


-2

Yapılandırma değiştiğinde, Android varsayılan olarak etkinliğinizi yeniden başlatır. Bunu değiştirmek için onConfigurationChanged()yöntemi geçersiz kılmalısınız. Ayrıca, android:configChangesmanifest dosyanıza eklemelisiniz .

Daha fazlasını buradan okuyabilirsiniz .


-7

Ben de kullandım

android:configChanges="orientation"

ve işe yaramadı.

Ama sonra bir çözüm buldum.

Manestinizde aşağıdaki satırın doğru olduğunu doğrulayın:

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

gibi bir şey okumadığından emin ol

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

İlk etapta ikinci yol vardı ama düzelttiğimde durumu korundu.


1
Bu tamamen farklı bir şey. Hedef SDK, uygulamanızı Android işletim sisteminin çoğu aralığı ile uyumlu hale getirmektir. Bu bir cevap değil, bazı yollarla sizin durumunuzda işe yaramış olabilir, ancak bu uygun bir çözüm değildir.
Rohan Kandwal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.