Po prostu nie potrzebuję nic do zmiany, gdy ekran jest obracany. Moja aplikacja wyświetla losowy obraz po pierwszym załadowaniu, a obrócenie urządzenia nie powinno wybierać innego losowego obrazu. Jak mogę (po prostu) powstrzymać to zachowanie?
Po prostu nie potrzebuję nic do zmiany, gdy ekran jest obracany. Moja aplikacja wyświetla losowy obraz po pierwszym załadowaniu, a obrócenie urządzenia nie powinno wybierać innego losowego obrazu. Jak mogę (po prostu) powstrzymać to zachowanie?
Odpowiedzi:
Generalnie można to zrobić na trzy sposoby:
Jak sugerowały niektóre odpowiedzi, możesz rozróżnić przypadki, w których Twoja aktywność została utworzona po raz pierwszy i z której została przywrócona savedInstanceState. Odbywa się to poprzez nadpisanie onSaveInstanceStatei sprawdzenie parametru onCreate.
Możesz zablokować aktywność w jednej orientacji, dodając android:screenOrientation="portrait"(lub "landscape") do <activity>w swoim manifeście.
Możesz powiedzieć systemowi, że zamierzasz samodzielnie obsługiwać zmiany ekranu, określając android:configChanges="orientation|screenSize"w <activity>tagu. W ten sposób aktywność nie zostanie odtworzona, ale zamiast tego otrzyma oddzwonienie (które możesz zignorować, ponieważ nie jest to dla Ciebie przydatne).
Osobiście wybrałbym (3). Oczywiście, jeśli zablokowanie aplikacji w jednej z orientacji Ci odpowiada, możesz również wybrać (2).
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"pracuje dla mnie. Dzięki @Pacerier
android:configChanges="orientation|screenSize"wartość API> = 13, ponieważ wiele osób uważa Twoją odpowiedź za główną!
Odpowiedź Xiona była bliska, ale nr 3 ( android:configChanes="orientation") nie zadziała, chyba że aplikacja ma poziom API 12 lub niższy.
Na poziomie API 13 lub wyższym rozmiar ekranu zmienia się, gdy zmienia się orientacja, więc nadal powoduje to zniszczenie działania i rozpoczęcie po zmianie orientacji.
Po prostu dodaj atrybut „screenSize”, tak jak poniżej:
<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>
Teraz, gdy zmienisz orientację (i zmieni się rozmiar ekranu), działanie zachowuje swój stan i onConfigurationChanged()jest wywoływane. Spowoduje to zachowanie wszystkiego, co jest na ekranie (np. Strony internetowej w widoku sieci Web) po zmianie orientacji.
Nauczyłem się tego z tej witryny: http://developer.android.com/guide/topics/manifest/activity-element.html
Jest to również najwyraźniej zła praktyka, więc przeczytaj poniższy link dotyczący obsługi zmian w czasie wykonywania:
http://developer.android.com/guide/topics/resources/runtime-changes.html
android:configChanges="orientation|screenSize"
Musisz tylko przejść do AndroidManifest.xmli wewnątrz lub w etykietach działań, musisz wpisać ten wiersz kodu, jak ktoś tam powiedział:
android:configChanges="orientation|screenSize"
Więc będziesz miał coś takiego:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
Mam nadzieję, że to działa!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
Po prostu dodaj android:configChanges="orientation|screenSize"w zakładce aktywności pliku manifestu.
Tak więc aktywność nie zostanie ponownie uruchomiona po zmianie orientacji.
onSaveInstanceState()i onCreate().
Z mojego doświadczenia wynika, że właściwie lepiej jest po prostu radzić sobie ze zmianami orientacji we właściwy sposób, zamiast próbować podbijać inne zachowanie.
Należy zapisać obraz, który jest aktualnie wyświetlany w programie onSaveInstanceState()i przywrócić go poprawnie po onCreate()ponownym uruchomieniu aplikacji .
android:configChangesnależy unikać używania i używać go tylko w ostateczności. Przeczytaj artykuł Obsługa zmian w czasie wykonywania, aby uzyskać więcej informacji o tym, jak prawidłowo obsłużyć ponowne uruchomienie z powodu zmiany konfiguracji”.
To rozwiązanie jest zdecydowanie najlepiej działające. W swoim pliku manifestu dodaj
<activity
android:configChanges="keyboardHidden|orientation|screenSize"
android:name="your activity name"
android:label="@string/app_name"
android:screenOrientation="landscape">
</activity
W swojej klasie aktywności dodaj następujący kod
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//your code
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//your code
}
}
dodaj android:configChanges="keyboardHidden|orientation|screenSize"dla wszystkich tagów działań aplikacji w manifeście.
Po prostu dodaj to do swojego AndroidManifest.xml
<activity android:screenOrientation="landscape">
Chodzi mi o to, że jest tag aktywności, dodaj to jako kolejny parametr. Jeśli potrzebujesz orientacji pionowej, zmień orientację poziomą na pionową. Mam nadzieję że to pomoże.
W pliku manifestu dodaj to do każdego działania. To pomoże
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
Zapisz szczegóły obrazu w swoim onPause()lub onStop()i użyj go w, onCreate(Bundle savedInstanceState)aby przywrócić obraz.
EDYTOWAĆ:
Więcej informacji na temat rzeczywistego procesu można znaleźć tutaj http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle, ponieważ w Honeycomb różni się on od poprzednich wersji Androida.
po prostu użyj : android:configChanges="keyboardHidden|orientation"
Jak wspomniał Pacerier,
android:configChanges="orientation|screenSize"
Nie wiem, czy najlepsze rozwiązanie, ale opisuję to tutaj:
Przede wszystkim potrzebujesz certyfikatu z twoją klasą. Aplikacja twojej aplikacji jest w twoim manifeście:
<application
android:name=".App"
...
Po drugie, w mojej aplikacji klasowej podobało mi się:
public class App extends Application {
public static boolean isOrientationChanged = false;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onConfigurationChanged(@NotNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
isOrientationChanged = true;
}
}
}
Po trzecie, musisz ustawić flagę na zmianę orientacji, w moim przypadku zawsze ustawiam ją, gdy wywoływana jest poprzednia aktywność w nawigacji aplikacji, więc dzwonię tylko raz, gdy tworzona jest późniejsza aktywność.
isOrientationChanged = false;
Więc za każdym razem, gdy zmieniam orientację mojego ekranu w tym kontekście, ustawiam go za każdym razem, gdy zmienia to ustawienie, sprawdza, czy nastąpiła zmiana orientacji, jeśli tak, sprawdza ją na podstawie wartości tej flagi.
Zasadniczo musiałem go używać za każdym razem, gdy wykonywałem asynchroniczne żądanie retrofitu, które nazywał każdą chwilą, która zmieniała orientację, ciągle zawieszając aplikację:
if (!isOrientationChanged) {
presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}
Nie wiem, czy to najbardziej eleganckie i najpiękniejsze rozwiązanie, ale przynajmniej tutaj funkcjonalne :)
Dodaj ten kod po onCreatemetodzie, w swoim działaniu zawierającymWebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)z github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/… w tym celu. Umożliwia odblokowanie, czego manifest nie umożliwia.