Jak zmienić aktywność bez animacji w systemie Android?

164

Jak prawidłowo używać flagi Intent FLAG_ACTIVITY_NO_ANIMATIONw pliku AndroidManifest? Wydaje mi się, że mój problem jest trywialny, ale nie mogę znaleźć dobrego przykładu ani rozwiązania.

    <intent-filter>
        <data android:name="android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION" />
    </intent-filter>

Jednak żaden błąd nie jest zgłaszany przez osobę nadzorującą, ale datanie jest poprawny. Chcę tylko wyłączyć animację w przypadku przełączania między działaniami. Mogę używać getWindow().setWindowAnimations(0);raczej w onCreate lub onResume, ale użycie flagi jest lepszym sposobem, prawda?

Mogę również użyć w kodzie:

    Intent intent = new Intent(v.getContext(), newactivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    getContext().startActivity(intent);

Ale chcę użyć tej flagi w manifeście Androida. Aby wyłączyć animację również w przypadku powrotu z drugiej czynności do pierwszej.

woyaru
źródło
Znalazłem propozycję wykorzystania motywu - poprzez zdefiniowanie animacji wejścia, wyjścia dla działań lub całej aplikacji. Czy ktoś może podać mi więcej informacji na ten temat?
woyaru

Odpowiedzi:

268

Możesz stworzyć styl,

 <style name="noAnimTheme" parent="android:Theme">
   <item name="android:windowAnimationStyle">@null</item>
</style>

i ustaw go jako motyw swojej aktywności w manifeście:

   <activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
    </activity>

Możesz także zdefiniować styl, aby określić niestandardowe animacje wejścia i wyjścia. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Santosh
źródło
Dzięki, działa to świetnie, szczególnie w przypadku działań o tematyce przezroczystej / dialogowej wykluczonych z ostatnich z innym powinowactwem do zadań. Bez tego animacja pokazywała się, tworząc bardzo dziwne wyniki dla otwieranego okna dialogowego!
3c71
to już nie działa dla Lollipopa / Androida 5.0?
kenyee
Mam Androida 5 i u mnie działa. Mój styl aplikacji wygląda następująco: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </item> </style>
eatyourgreens
Działa również doskonale w wersji 6.0. Świetna wskazówka. Jak pytam poniżej, zastanawiam się, jak wyłączyć animację, która ma miejsce, gdy * po raz pierwszy uruchamiam aplikację ... czy jest na to sposób ?!
Fattie
5
ulegnie awarii, jeśli rozszerzysz AppCompatActivity
Mike6679
191

Jeśli kontekst jest aktywnością, możesz wywołać overridePendingTransition :

Wywołaj natychmiast po jednym ze smaków startActivity (Intent) lub finish, aby określić jawną animację przejścia do wykonania w następnej kolejności.

Tak więc programowo:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
eshirazi
źródło
czy można to zrobić też przez adb?
programista Androida
@TalAngel overridePendingTransitionzostał dodany na poziomie API 5. Więc nie, nie działa na "każdej" wersji Androida, ale myślę, że celujesz w wyższy poziom API niż 5.
Bruno Bieri
43

Wypróbuj ten kod,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Bartłomiej Jończy
źródło
1
To naprawdę pomaga przy rozpoczynaniu działalności od usługi.
DrogiDhruv,
24

Możesz to również zrobić we wszystkich działaniach, z których nie chcesz przechodzić:

@Override
public void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}

Podoba mi się to podejście, ponieważ nie musisz mieszać ze stylem swojej działalności.


źródło
Świetna wskazówka. Zastanawiam się, jak wyłączyć animację, która dzieje się podczas * pierwszego uruchomienia aplikacji ... czy jest na to sposób ?!
Fattie
@Fattie Zastąp metodę onStart () swojego działania uruchamiającego i umieść w niej ten sam kod.
Jawad Adil
4

Oto rozwiązanie z jedną linijką, które działa tak nisko, jak minSdkVersion 14należy włożyć w siebie res/styles.xml:

<item name="android:windowAnimationStyle">@null</item>

tak:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:windowAnimationStyle">@null</item>
    </style>
    ...
</resources>

Twoje zdrowie!

user1506104
źródło
3

Linia w stylu motywu działa dobrze, ale zastępuje animację białym ekranem. Szczególnie na wolniejszym telefonie - jest to naprawdę denerwujące. Tak więc, jeśli chcesz natychmiastowego przejścia - możesz użyć tego w stylu motywu:

<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowDisablePreview">true</item>
Vladimir Demirev
źródło
2

stwórz swój własny styl nadrzędny android: Theme

<style name="noAnimationStyle" parent="android:Theme">
    <item name="android:windowAnimationStyle">@null</item>
</style>

Następnie użyj go w manifestie w następujący sposób:

<activity android:name=".MainActivity"
    android:theme="@style/noAnimationStyle">
</activity>
goyo
źródło
0

Po rozpoczęciu zamiaru możesz użyć tego kodu:

Intent intent = new Intent(Activity1.this, Activity2.class);
overridePendingTransition(0, 0);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);

Jeśli zostanie użyty, intencja będzie działać bez animacji ani przejść

Faran
źródło