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.


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


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);

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));

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.


Ś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!


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>

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>

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ść

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.