9

Tôi muốn đi từ một danh sách xem đến xem chi tiết và do đó, tôi sử dụng sau OnClickListener trong danh sách của tôi:Giao dịch Fragment với quá trình chuyển đổi - transitionNames Unique được yêu cầu

@Override 
public void onClick(View view) 
{ 
    Bet bet = (Bet)view.getTag(); 
    FragmentManager fm = getActivity().getSupportFragmentManager(); 
    BetDetailFragment f = BetDetailFragment.create(bet); 
    String tag = f.getClass().getName(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    { 
     setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move)); 
     f.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move)); 
    } 

    FragmentTransaction ft = fm.beginTransaction() 
      .replace(R.id.frame_container, f, tag) 
      .addToBackStack(tag); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    { 
     L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo1(bet) + "|" + view.findViewById(R.id.ivLogo1)); 
     L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo2(bet) + "|" + view.findViewById(R.id.ivLogo2)); 
     ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");//TransitionUtil.getTransitionNameBetLogo1(bet)); 
     ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");//TransitionUtil.getTransitionNameBetLogo2(bet)); 
    } 
    ft.commit(); 
} 

chức năng của tôi trở lại tên duy nhất, tôi có hai quan điểm khác nhau, nhưng nó vẫn không hoạt động. tôi đã nhận xét các chức năng không cần thiết ra và viết một số tên giao dịch duy nhất trong đó bằng tay ... Nhưng vẫn còn, tôi nhận được ngoại lệ này, trong dòng của addSharedElement đầu tiên:

java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements 
     at android.support.v4.app.BackStackRecord.addSharedElement 

EDIT

Nếu không có các yếu tố được chia sẻ, mọi thứ đều hoạt động hoàn hảo ...

Trả lời

23

Vấn đề là, addSharedElement KHÔNG đặt tên giao dịch của chế độ xem!

Vì vậy, trong ví dụ của tôi, tôi sẽ phải thiết lập nó với đoạn mã sau:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "1"); 
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "2"); 

TRƯỚC tôi thêm quan điểm này cho FragmentTransaction ...

công trình Sau đó sau tốt và như mong đợi:

ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1"); 
ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2"); 
+0

Cảm ơn bạn rất nhiều vì điều này! –

0

Nếu onClickListener là một phần của phân đoạn của bạn, không phải là phụ huynh Activity, thì bạn đang làm điều sai ở đây. Mảnh của bạn nên thông báo cho hoạt động của cha mẹ những gì nó muốn và Activty nên đối phó với nó (tức là bằng cách thay thế các mảnh vv). Fragment không bao giờ nên tự làm điều này. Ngoài ra nếu tất cả những gì bạn cần là chuyển từ chế độ xem chi tiết sang danh sách, thì tôi giả sử bạn đã nhập chế độ xem chi tiết của mình từ danh sách đó. Nếu vậy, tất cả những gì bạn cần là để pop phần tử cuối cùng (fragment view fragment) fromt back stack. Xem: https://developer.android.com/reference/android/app/FragmentManager.html

+0

chỉ để làm rõ, vấn đề duy nhất là hoạt ảnh của các thành phần được chia sẻ ... Thay đổi phân đoạn và vì vậy hoạt động tốt. Đến một điểm khác, bạn nói đúng, nên được thực hiện trong hoạt động ... Tôi chỉ lười biếng để đặt chức năng ở đó, vì dòng chảy của tôi thật dễ dàng ... – prom85

0

trước onClick

sử dụng đồng này de

ViewCompat.setTransitionName(holder.ivImage, "value"); 
Các vấn đề liên quan