Odpowiedzi:
Jeśli chcesz wymusić TextView
zapisanie swojego stanu musisz dodać freezesText
atrybut:
<TextView
...
android:freezesText="true" />
Z dokumentacji freezesText
:
Jeśli jest ustawiona, widok tekstu będzie zawierał swój bieżący pełny tekst wewnątrz zamrożonego sopla oprócz metadanych, takich jak bieżąca pozycja kursora. Domyślnie jest to wyłączone; może być przydatne, gdy zawartość widoku tekstu nie jest przechowywana w trwałym miejscu, takim jak dostawca treści
Aby zachować dane o zmianie orientacji, musisz wdrożyć dwie metody:
@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);
}
1) Nie wszystkie widoki z identyfikatorem zapisują swój stan. Widżety Androida z identyfikatorem, którego stan może zmienić użytkownik, wydają się zapisywać swój stan po miękkim zabiciu. Więc EditText zapisuje swój stan, ale TextView nie zapisuje swojego stanu po miękkim zabiciu.
„AFAIK, Android zajmuje się zapisywaniem stanu tylko dla rzeczy, które mają się zmienić. Dlatego zapisuje tekst w EditText (który użytkownik prawdopodobnie zmieni) i być może nie zapisuje stanu dla TextView (który zwykle pozostaje statyczny ) ”
Mark M.
Możesz więc zdecydować się na zapisanie stanu widoku tekstu w onSaveInstanceState i możesz wybrać przywrócenie stanu widoku tekstu w onCreate.
2) Najlepszą praktyką jest zapisanie „wewnętrznego” stanu wystąpienia bez widoku, nawet jeśli zadeklarujesz
android:configChanges= "orientation|keyboardHidden"
Z dokumentów:
„Jednak aplikacja powinna zawsze mieć możliwość zamykania i ponownego uruchamiania z nienaruszonym poprzednim stanem. Nie tylko z powodu innych zmian w konfiguracji, którym nie można zapobiec przed ponownym uruchomieniem aplikacji, ale także w celu obsługi zdarzeń, takich jak otrzymanie przez użytkownika przychodzącego rozmowa telefoniczna, a następnie wraca do aplikacji ”.
JAL
Android nie obsługuje tego typu rzeczy za Ciebie. Zapisałeś wszystkie dane ręcznie.
Możesz użyć w działaniu, aby zapisać wartości
@Override
public Object onRetainNonConfigurationInstance() {
HashMap<String, Object> savedValues = new HashMap<String, Object>();
savedValues.put("someKey", someData);
return savedValues;
}
i użyj czegoś takiego w metodzie oncreate działania, aby załadować zapisane obiekty
HashMap < String, Object> savedValues
= (HashMap<String, Object>)this.getLastNonConfigurationInstance();
możesz również wybrać opcję wyłączenia zmiany orientacji dla działania
<activity android:name=".Activity" android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
Zmodyfikuj swoje działania w AndroidManifest.xml, aby nadpisać zachowanie zmiany orientacji, dodając to do swojej aktywności / działań:
android:configChanges="orientation|keyboardHidden"
Powinien wyglądać mniej więcej tak:
<activity android:name=".activity.LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
</activity>
Dodaj je do pliku AndroidManifest.xml
Umieść nazwę działania w miejscu nazwa_działania
<activity android:name="Activity_Name"
android:screenOrientation="sensor"
...
android:configChanges="orientation|keyboardHidden|screenSize">
Będzie to działać również w przypadku zmiany wartości TextField.
poprostu dodaj
android:configChanges="orientation|screenSize"
do swojej aktywności w AndroidManifest.xml.
Po zmianie konfiguracji Android ponownie uruchamia Twoją aktywność domyślnie. Aby to zmienić, należy zastąpić onConfigurationChanged()
metodę. Powinieneś także dodaćandroid:configChanges
do pliku manifestu.
Możesz przeczytać więcej tutaj .
Użyłem też
android:configChanges="orientation"
i to nie zadziałało.
Ale potem znalazłem rozwiązanie.
Sprawdź, czy masz następujący wiersz poprawnie w swoim pierwszym:
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />
upewnij się, że nie ma czegoś takiego jak
<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`
Miałem to na drugim miejscu, ale po poprawieniu stan został zachowany.