2012-01-12 40 views
27

Tôi đang chèn Những mảnh vỡ vào Hoạt động sử dụng mã này:Fragment mất hình ảnh động chuyển tiếp sau khi thay đổi cấu hình

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    FragmentManager fm = getFragmentManager(); 
    String tag = "simple"; 

    Fragment fr = fm.findFragmentByTag(tag); 
    if (fr == null) 
    { 
     SimpleFragment simpleFragment = new SimpleFragment(); 
     FragmentTransaction transaction = fm.beginTransaction(); 
     transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out, 
             android.R.animator.fade_in, android.R.animator.fade_out); 
     transaction.add(R.id.main_layout, simpleFragment, tag); 
     transaction.addToBackStack(tag); 
     transaction.commit(); 
    } 
} 

Những mảnh vỡ đang:

public class SimpleFragment extends ListFragment 
{ 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     getView().setBackgroundColor(Color.YELLOW); 
    } 
} 

Khi tôi bật đoạn từ backstack qua nút Back ngay sau khi ra mắt, sau đó mọi thứ đều ổn và tôi có thể thấy hoạt ảnh mờ dần. Nhưng nếu tôi xoay thiết bị và nhấn nút Quay lại thì phân đoạn sẽ biến mất mà không có hoạt ảnh.

Đây có phải là hành vi của Android hoặc tôi đang làm điều gì sai?

EDIT: Dường như sau khi xoay FragmentManager không khôi phục hoạt ảnh (enterAnim, exitAnim, popEnterAnim và popExitAnim) cho BackStackEntry.

FragmentManager bãi (không xoay):

Active Fragments in 4087d668: 
    #0: SimpleFragment{408883b0 #0 id=0x7f050000 simple} 
    mFragmentId=#7f050000 mContainerId#=7f050000 mTag=simple 
    mState=4 mIndex=0 mWho=android:fragment:0 mBackStackNesting=1 
    mAdded=true mRemoving=false mResumed=true mFromLayout=false mInLayout=false 
    mHidden=false mDetached=false mRetainInstance=false mRetaining=false mHasMenu=false 
    mFragmentManager=FragmentManager{4087d668 in ListViewFragmentsActivity{4087d588}} 
    [email protected] 
    [email protected] 
    mNextAnim=17498112 
    [email protected] 
    [email protected] 
Added Fragments: 
    #0: SimpleFragment{408883b0 #0 id=0x7f050000 simple} 
Back Stack: 
    #0: [email protected] 
    mName=simple mIndex=0 mCommitted=true 
    mEnterAnim=#10b0000 mExitAnim=#10b0001 
    Operations: 
     Op #0: 
     cmd=1 fragment=SimpleFragment{408883b0 #0 id=0x7f050000 simple} 
    enterAnim=17498112 exitAnim=17498113 
    popEnterAnim=17498112 popExitAnim=17498113 
Back Stack Indices: 
    #0: [email protected] 
FragmentManager misc state: 
    mCurState=5 mStateSaved=false mDestroyed=false 

FragmentManager bãi (sau khi xoay):

Active Fragments in 40877f38: 
    #0: SimpleFragment{40878858 #0 id=0x7f050000 simple} 
    mFragmentId=#7f050000 mContainerId#=7f050000 mTag=simple 
    mState=4 mIndex=0 mWho=android:fragment:0 mBackStackNesting=1 
    mAdded=true mRemoving=false mResumed=true mFromLayout=false mInLayout=false 
    mHidden=false mDetached=false mRetainInstance=false mRetaining=false mHasMenu=false 
    mFragmentManager=FragmentManager{40877f38 in ListViewFragmentsActivity{40877e58}} 
    [email protected] 
    [email protected] 
    [email protected] 
    [email protected] 
Added Fragments: 
    #0: SimpleFragment{40878858 #0 id=0x7f050000 simple} 
Back Stack: 
    #0: [email protected] 
    mName=simple mIndex=0 mCommitted=false 
    Operations: 
     Op #0: 
     cmd=1 fragment=SimpleFragment{40878858 #0 id=0x7f050000 simple} 
Back Stack Indices: 
    #0: [email protected] 
FragmentManager misc state: 
    mCurState=5 mStateSaved=false mDestroyed=false 
+0

Tôi cũng gặp vấn đề tương tự. Bạn có may mắn tìm ra nó không? – khendricks

+0

@khendricks Không, và bạn? – Max

+1

Thật không may là không. Tôi bị sốc vì không có nhiều người phàn nàn về điều này. Tôi đã tạo một báo cáo lỗi cho vấn đề này. http://code.google.com/p/android/issues/detail?id=25994&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars – khendricks

Trả lời

2

Được rồi vì vậy đây là một lỗi mà cũng là một vấn đề đối với thư viện nguồn gốc (không chỉ hỗ trợ thư viện).

Cách giải quyết duy nhất tôi có thể đề xuất là tạo ngăn xếp lưng của riêng bạn và sau đó xử lý onBack với cài đặt triển khai tùy chỉnh của riêng bạn làm hoạt ảnh phù hợp khi bạn quay lại ngăn xếp của riêng mình.

1

Một đề xuất thay thế để giải quyết vấn đề này là tải xuống nguồn cho thư viện hỗ trợ và thực hiện thay đổi mà tôi đã đề xuất trong lỗi (http://code.google.com/p/android/issues/detail?id=25994), tất nhiên điều này có nghĩa là duy trì bản sao thư viện hỗ trợ và không có thể sử dụng hỗ trợ gốc, tuy nhiên điều đó phụ thuộc vào mức độ quan trọng của vấn đề này đối với bạn.

10

Để giải quyết vấn đề này, bạn có thể sử dụng phương thức onCreateAnimator/onCreateAnimation trong các đoạn của mình.

Ví dụ để thực hiện các mảnh vỡ có nguồn gốc:

@Override 
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { 
    if (enter) { 
     return AnimatorInflater.loadAnimator(getActivity(), R.animator.slide_in_top); 
    } else { 
     return AnimatorInflater.loadAnimator(getActivity(), R.animator.fade_out); 
    } 
} 

Kỹ thuật tương tự cho mảnh thư viện hỗ trợ với Animation để thay thế. Trong trường hợp này, bạn cũng có nhiều quyền kiểm soát hơn về cách bạn muốn phát hoạt ảnh tùy thuộc vào trạng thái phân mảnh và/hoặc đối số.

+0

Khi sử dụng hỗ trợ-v4, bạn có thể sử dụng 'onCreateAnimation()' và lớp trình trợ giúp 'AnimationUtils' để tải Ảnh động. –

+1

Hãy nhớ rằng cơ chế này không đối phó với việc sử dụng một hình ảnh động khác nhau cho popping ngăn xếp trở lại. Bạn sẽ phải tự xử lý luồng này. –

+0

Phương thức này có ảnh hưởng đến 'transaction.setCustomAnimations' không? Nó có thể thiết lập hoạt hình hai lần. – Ryde

1

Bạn có thể sử dụng onCreateAnimation plus AnimationUtils cho mỗi đoạn thay vì transaction.setCustomAnimations (..). Ngoài ra để bỏ qua hoạt hình trong khi khôi phục, hãy xem xét về cờ boleean.

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    mIsRestoring = savedInstanceState != null; 
    ... 
} 

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
    if (mIsRestoring) { 
     mIsRestoring = false; 
     return null; 
    } 
    if (enter) { 
     return AnimationUtils.loadAnimation(getContext(), R.anim.enter_from_right); 
    } else { 
     return AnimationUtils.loadAnimation(getContext(), R.anim.exit_to_left); 
    } 
} 
+0

nhưng làm cách nào để chúng tôi triển khai hoạt ảnh từ đầu đến đúng? Ý tôi là, khi thực hiện giao dịch phân đoạn, bạn sẽ chuyển 4 hình động khác nhau. 2 cho chuyển động về phía trước, 2 cho popbackstack. như enter-from-right/exit-to-left, và enter-from-left/exit-to-right –

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