2011-01-08 124 views
23

我在堆棧中有兩個活動,爲了向他們展示我使用了FLAG_ACTIVITY_REORDER_TO_FRONT。到目前爲止,如果我想使用overridePendingTransition爲動畫帶來動畫,問題就來了。當使用FLAG_ACTIVITY_REORDER_TO_FRONT時,overridePendingTransition不起作用

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
ActivityA.this.startActivity(i); 
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

但是,如果未將標誌添加到意圖(刪除第2行),則不會顯示轉換,則不會出現問題。

是否可以通過動畫將活動帶到前面?

非常感謝!

回答

0

如何在第二個活動的onCreate()或onStart()中創建動畫。

+0

嗯......聽起來不錯!非常感謝。我將學習如何處理動畫並嘗試。 – Daniel 2011-01-09 20:10:00

+0

@Daniel檢查APIDemos(與android框架一起提供)com.example.android.apis.animation.Rotation3dAnimation.java以及它如何在Transition3D.java中使用。應該給你很好的見解。 – GSree 2011-01-10 00:06:34

+0

感謝GSree的幫助!我嘗試在活動A的onPause()中啓動一個滑出式動畫,並從活動B中在onResume()中滑入一個幻燈片。這是一個不錯的主意,它運作良好,但它不夠流暢,因爲你可以看到一種黑色的眨眼,因爲這些動畫不是同時被執行的。我一直在努力,如果我找到一個好的解決方案,我會讓它知道。 – Daniel 2011-01-10 15:35:31

1

我的同事遇到了這個問題,他設法通過添加最小的SDK屬性(5及以上)來解決它。

由於此功能自api 5起可用,因此強制使用更高的sdk級別對我們來說是個訣竅。

34

我遇到了同樣的問題。訣竅是覆蓋onResume()回調中的轉換。

@Override 
public void onResume() { 
    super.onResume(); 
    overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 
} 
31

其實正確的解決方案在使用REORDER_TO_FRONT是調用overridePendingTransition在你要打開活動的方法onNewIntent()。

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
} 

替換爲您的轉換。

如果您需要有選擇地替換過渡,您可以添加一個額外的意圖,並在onNewIntent()中檢查以決定要執行的操作。

如果您不知道將要打開的轉換(例如,如果您沒有明確指定它),那麼這是不合適的,否則是正確的解決方案。

-2

我做了類似的事情,我做如下:

private Stack<String> stack; 
ViewAnimator mViewAnimator; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mViewAnimator = new ViewAnimator(this); 
    if (stack == null) stack = new Stack<String>(); 
    push("FirstStackActivity", new Intent(this, FirstStackActivity.class)); 
} 

@Override 
public void finishFromChild(Activity child) { 
    pop(); 
} 

@Override 
public void onBackPressed() { 
    pop(); 
} 

public void push(String id, Intent intent) { 
    Window window = getLocalActivityManager().startActivity(id, intent); 
    if (window != null) { 
     stack.push(id); 
     View view = window.getDecorView(); 
     mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in)); 
     mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));    
     mViewAnimator.addView(view); 
     mViewAnimator.showNext(); 
     setContentView(mViewAnimator); 
    } 
} 

public void pop() { 
    if (stack.size() == 1) finish(); 
    if (stack.size() > 0) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     Intent lastIntent = manager.getActivity(stack.peek()).getIntent(); 
     Window newWindow = manager.startActivity(stack.peek(), lastIntent); 
     View view = newWindow.getDecorView(); 
     mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in)); 
     mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out)); 
     mViewAnimator.showPrevious(); 
     mViewAnimator.removeView(view); 
    } 
    destroy(stack.pop()); 
} 


/** 
* BugFix official 
* @param id 
* @return 
*/ 
public boolean destroy(String id) { 
    final LocalActivityManager activityManager = getLocalActivityManager(); 
    if (activityManager != null) { 
     activityManager.destroyActivity(id, false); 
     try { 
      final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities"); 
      if (mActivitiesField != null) { 
       mActivitiesField.setAccessible(true); 
       @SuppressWarnings("unchecked") 
       final Map<String, Object> mActivities = (Map<String, Object>) mActivitiesField.get(activityManager); 
       if (mActivities != null) { 
        mActivities.remove(id); 
       } 
       final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray"); 
       if (mActivityArrayField != null) { 
        mActivityArrayField.setAccessible(true); 
        @SuppressWarnings("unchecked") 
        final ArrayList<Object> mActivityArray = (ArrayList<Object>) mActivityArrayField.get(activityManager); 
        if (mActivityArray != null) { 
         for (Object record : mActivityArray) { 
          final Field idField = record.getClass().getDeclaredField("id"); 
          if (idField != null) { 
           idField.setAccessible(true); 
           final String _id = (String) idField.get(record); 
           if (id.equals(_id)) { 
            mActivityArray.remove(record); 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 
    return false; 
} 
2

調用

overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

結束後();的結束活動爲我工作。

finish(); 
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

這比打電話更好的onResume,因爲它使活動有關進入和退出動畫更獨立:


發送者的活動結束後,調用:

活動A ---進入轉換1(在A上)--->活動B ---輸入轉換2(在B上)--->活動C

活動A < ---退出轉換1(在B上)---活動B < ---退出轉換2(在C上)---活動C

活動A ---輸入轉換1(在A上)--->活動C ---輸入轉換3(在C上) - - >活動B

活動A < ---出口過渡3(上C)---活動ç< ---出口過渡2(上B)---活動B



調用onResume接收器活動:

活動A ---輸入轉換1(在B上)--->激活B ---輸入轉換2(在C上)--->活動C

活動A < ---輸入轉換1(在A上)---活動B < ---輸入轉換2(在B上)---活動ç

活性A ---輸入過渡3(上C)--->活動ç---輸入過渡2(上B)--->活動B

活性甲< ---輸入轉換1(在A上)---活動C < ---輸入轉換3(在C上)---活動B

這裏onResume動畫必須始終保持不變這是發件人的活動,而不是第一種方法,您可以在其中輕鬆定製動畫。

2

對我來說,解決辦法是確保它在UI線程

runOnUiThread(new Runnable() { 
      public void run() { 
       startActivity(new Intent(ActivityOne.this, ActivityTwo.class)); 
       overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
      } 
     }); 

     finish(); 
1

我得到了同樣的問題跑了。 我建議你檢查你的AndroidManifest.xml,以確保ActivityA和ActivityB都沒有設置Theme.Translucent.NoTitleBar,這個主題包含「android:windowIsTranslucent」= true導致該問題。

希望這對你有所幫助。

相關問題