У меня есть RecyclerView
внутри Fragment
, который принадлежит ViewPager
.Я пытаюсь установить Transition
на секунду Fragment
при нажатии на элемент внутри ViewPager
.Я чувствую, что исчерпал ресурсы для других подобных вопросов, которые были заданы, и попытался найти их решение безрезультатно.
У меня нет проблем, просто выполняя любой другой переход;это SharedElementTransition
, что я не могу работать.Любая помощь будет принята с благодарностью.
Я устанавливаю TransitionName
каждого отдельного элемента в методе onBindViewHolder
, и я вызываю postponeEnterTransition
в onCreate
моей цели Fragment
, пока все Views
созданы.Всякий раз, когда я нажимаю на элемент в RecyclerView
, я, кажется, полностью пропускаю анимацию и прыгаю прямо к финальному фрагменту View
.
My RecyclerAdapter
:
@Override
public void onBindViewHolder(@NonNull final GroupRecyclerAdapter.GroupViewHolder viewHolder, int position) {
if(groupsList !=null){
final GroupBase currentGroup = groupsList.get(position);
ViewCompat.setTransitionName(viewHolder.nameTxt,"transition"+position);
viewHolder.nameTxt.setText(currentGroup.getName());
//viewHolder.nameTxt.setTransitionName("Transition"+position);
Log.i(TAG,"New ViewHolder with TransitionName: "+ viewHolder.nameTxt.getTransitionName());
viewHolder.descTxt.setText(currentGroup.getDescription());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
groupClickListener.onGroupClick(viewHolder.getAdapterPosition(), currentGroup, viewHolder.nameTxt);
}
});
}
}
содержащий RecyclerView
:
@Override
public void onGroupClick(int position, GroupBase groupBase, View sharedView) {
Log.i(TAG,"Clicked on a Group View with TransitionName: "+sharedView.getTransitionName());
Fragment detailedGroup = Detailed_Group_Fragment.newInstance(groupBase,
sharedView.getTransitionName());
detailedGroup.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
//detailedGroup.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade));
Log.i(TAG,"TRANSITION NAME OF Recycler TextView : "+ sharedView.getTransitionName());
getFragmentManager()
.beginTransaction()
.addSharedElement(sharedView, "transition")
.replace(R.id.core_frame,detailedGroup)
.addToBackStack(null)
.commit();
}
Моя цель Fragment
:
@Nullable
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final GroupBase groupBase = getArguments().getParcelable(GROUP_BASE);
String transitionName = getArguments().getString(TRANSITION_NAME);
Log.i(TAG,"TransitionName variable in detail is: "+transitionName);
TextView name = view.findViewById(R.id.detail_group_name_txt);
name.setText(groupBase.getName());
//name.setTransitionName(transitionName);
ViewCompat.setTransitionName(name,"transition");
startPostponedEnterTransition();
}
Ни у одного из моих представлений не установлено TransitionName
в файле .xml, и все отображается так, как ожидалось.
РЕДАКТИРОВАТЬ
Из дальнейшего исследования, кажется, возникает проблема, когда я пытаюсь выполнить FragmentTransactions
для загрузки нового Fragment
из ViewPager
,Согласно этому предложению , в моем ViewPager
хосте Activity
я звоню postponeEnterTransition()
, а также реализовал interface
, который вызывается, когда мои целевые Fragment
представления были созданы.Однако при переходе от ViewPager
Fragment
к цели Fragment
.
Host Activity
:
public class Core_Activity extends AppCompatActivity implements
View.OnClickListener, Detailed_Group_Fragment.TransitionScheduler {
private static final String TAG = "Core_Activity";
private ViewPager viewPager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
...
}
...
public void scheduleStartTransition(final View sharedView){
sharedView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
Log.i(TAG,"The sharedView called onPreDraw.");
sharedView.getViewTreeObserver()
.removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
}
);
}
Моя пересмотренная цель * 1060 нет изменений.*:
public class Detailed_Group_Fragment extends Fragment {
private static final String TAG = "Detailed_Group_Fragment";
private static final String TRANSITION_NAME = "transition_name";
private static final String GROUP_BASE = "group_base";
TransitionScheduler transitionScheduler;
public interface TransitionScheduler{
void scheduleStartTransition(View sharedView);
}
public static Detailed_Group_Fragment newInstance(GroupBase groupBase, String transitionName){
Detailed_Group_Fragment detailed_group_fragment = new Detailed_Group_Fragment();
Bundle bundle = new Bundle();
bundle.putParcelable(GROUP_BASE, groupBase);
bundle.putString(TRANSITION_NAME,transitionName);
detailed_group_fragment.setArguments(bundle);
return detailed_group_fragment;
}
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final GroupBase groupBase = getArguments().getParcelable(GROUP_BASE);
String transitionName = getArguments().getString(TRANSITION_NAME);
final TextView name = view.findViewById(R.id.detail_group_name_txt);
name.setText(transitionName);
name.setTransitionName("hungry");
transitionScheduler.scheduleStartTransition(name);
TextView desc = view.findViewById(R.id.group_desc_txt);
desc.setText(groupBase.getDescription());
final ImageView image = view.findViewById(R.id.group_image);
if(groupBase.getImageURI()!=null && groupBase.getBytes()==null){
Log.i(TAG,"Fetching the photo for this group.");
mGroupViewModel.getImage(groupBase.getImageURI())
.addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
groupBase.setBytes(bytes);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
image.setImageBitmap(bitmap);
}
});
}
if(groupBase.getBytes()!=null){
Bitmap bitmap = BitmapFactory.decodeByteArray(groupBase.getBytes(),0,groupBase.getBytes().length);
image.setImageBitmap(bitmap);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
//We need to get an instance of the Class that will execute our interface method.
transitionScheduler = (TransitionScheduler) getActivity();
} catch (ClassCastException e) {
Log.e(TAG,"Class cast exception." + e.getMessage());
}
}