2011-01-08 32 views
23

Tôi có hai hoạt động trong ngăn xếp, để hiển thị chúng, tôi sử dụng FLAG_ACTIVITY_REORDER_TO_FRONT. Cho đến nay rất tốt, vấn đề xảy ra khi tôi muốn đưa hoạt động bằng hoạt ảnh bằng cách sử dụng overridePendingTransition.ghi đèPendingTransition không hoạt động khi FLAG_ACTIVITY_REORDER_TO_FRONT được sử dụng

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

Chuyển đổi không được hiển thị, tuy nhiên, nếu cờ không được thêm vào ý định (xóa dòng 2) thì không có vấn đề gì.

Có thể đưa hoạt động lên trước bằng hoạt ảnh không?

Cảm ơn rất nhiều!

Trả lời

0

Cách tạo hoạt ảnh trong onCreate() hoặc onStart() của hoạt động thứ hai.

+0

Hmm ... nghe như một ý tưởng hay! cảm ơn rất nhiều. Im sẽ tìm hiểu làm thế nào để đối phó với hình ảnh động và thử điều đó. – Daniel

+0

@Daniel kiểm tra APIDemos (được cung cấp cùng với khung công tác android) com.example.android.apis.animation.Rotation3dAnimation.java và cách nó được sử dụng trong Transition3D.java. Nên cung cấp cho bạn cái nhìn sâu sắc. – GSree

+0

Cảm ơn GSree vì sự giúp đỡ của bạn! Tôi đã cố gắng để khởi động một slide-out hoạt hình trong onPause() từ hoạt động A, và một slide trong onResume() từ hoạt động B. Đó là một ý tưởng tốt đẹp, và nó làm việc ra, nhưng nó không đủ mịn , như bạn có thể thấy một loại chớp đen, bởi vì các hình động không được cắt ra cùng một lúc. Tôi tiếp tục làm việc này, nếu tôi tìm được giải pháp tốt, tôi sẽ cho nó biết. – Daniel

1

Đồng nghiệp của tôi gặp sự cố này và anh ấy đã giải quyết được vấn đề bằng cách thêm thuộc tính SDK tối thiểu (5 trở lên) vào nó.

vì tính năng này khả dụng kể từ api 5, việc thực thi việc sử dụng cấp độ sdk cao hơn đã thực hiện mẹo cho chúng tôi.

34

Tôi đã gặp phải sự cố tương tự này. Bí quyết là ghi đè quá trình chuyển đổi trong hàm gọi lại onResume().

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

bằng cách thực hiện nó trong onResume(). Hiệu ứng không hoàn toàn suôn sẻ khi hoạt động đầu tiên được đưa lên đầu, nó xuất hiện với một cú giật – Ravi

+0

điều này làm việc cho tôi khi tôi bắt đầu một hoạt động mới từ dịch vụ, và cần phải ghi đè lên sự hoán đổi đang chờ xử lý! – cwhsu

+2

Đề xuất này không chính xác. onResume được gọi trong nhiều dịp mà không có gì để làm với một ý định mới đang được sử dụng. Giải pháp đúng là giải pháp tôi đã chỉ ra: thực hiện trong phương thức onNewIntent() –

31

Thực ra giải pháp đúng khi sử dụng REORDER_TO_FRONT là gọi hàm ghi đèPendingTransition trong phương thức trênNewIntent() của hoạt động bạn sẽ mở.

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

thay thế bằng quá trình chuyển đổi của bạn.

Nếu bạn cần thay thế có chọn lọc quá trình chuyển đổi, bạn có thể thêm mục đích bổ sung và kiểm tra nó trong onNewIntent() để quyết định việc cần làm.

Điều này không phù hợp nếu bạn không biết quá trình chuyển đổi sẽ được mở (nếu bạn không chỉ định rõ ràng ví dụ), nhưng nếu không thì đó là giải pháp phù hợp.

+6

Giải pháp thích hợp duy nhất. Nên được chấp nhận trả lời. – tomrozb

+0

Tôi ước gì tôi biết tại sao một số người downvoted câu trả lời của tôi, đây là, như tomrozb cho biết, giải pháp thích hợp duy nhất –

-2

tôi đã làm một cái gì đó tương tự và tôi đã như sau:

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

Calling

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

sau khi kết thúc(); của các hoạt động đóng cửa đã làm việc cho tôi.

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

Đó là tốt hơn so với gọi onResume, bởi vì nó làm cho hoạt động độc lập hơn về nhập cảnh, xuất cảnh hình ảnh động:


Calling sau khi kết thúc hoạt động người gửi:

Hoạt động A --- Nhập Chuyển tiếp 1 (trên A) ---> Hoạt động B --- Nhập Chuyển tiếp 2 (trên B) ---> Hoạt động C

Hoạt động A < --- Thoát Chuyển tiếp 1 (trên B) --- Hoạt động B < --- Thoát khỏi chuyển tiếp 2 (trên C) --- Hoạt động C

Hoạt động A --- Nhập chuyển tiếp 1 (trên A) ---> Hoạt động C --- Nhập chuyển tiếp 3 (trên C) - -> Hoạt động B

Hoạt động Một < --- Thoát chuyển 3 (trên C) --- Hoạt động C < --- Thoát chuyển 2 (trên B) --- Hoạt động B



Gọi trên onResume của hoạt động người nhận:

Hoạt động A --- Nhập chuyển tiếp 1 (trên B) ---> Kích hoạt ity B --- Enter Transition 2 (on C) ---> Hoạt động C

Hoạt động A < --- Enter Transition 1 (on A) --- Activity B < --- Enter Transition 2 (on B)) --- Hoạt động C

Hoạt động A --- Nhập chuyển 3 (trên C) ---> Hoạt động C --- Nhập chuyển 2 (trên B) ---> Hoạt động B

Hoạt động Một < --- Nhập chuyển tiếp 1 (trên A) --- Hoạt động C < --- Nhập chuyển tiếp 3 (trên C) --- Hoạt động B

Tại đây hoạt ảnh onResume luôn phải giống nhau hoạt động của người gửi, thay vào đó là cách tiếp cận đầu tiên, nơi bạn có thể tùy chỉnh hoạt ảnh dễ dàng.

2

đối với tôi, giải pháp là để đảm bảo nó chạy trong thread 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(); 
+0

trong trường hợp của tôi, đó là chính xác lỗi của tôi –

1

Tôi có cùng một vấn đề. Tôi khuyên bạn nên kiểm tra AndroidManifest.xml để đảm bảo ActivityA và ActivityB đều không được đặt Theme.Translucent.NoTitleBar, chủ đề này chứa "android: windowIsTranslucent" = true gây ra sự cố.

Hy vọng điều này sẽ giúp bạn.

Các vấn đề liên quan