我想从回收视图的两个文本视图有一个正确的过渡时,返回。现在它的工作非常奇怪,我的意思是返回过渡的两个文本视图开始从11元素,然后它是我想要的,但在此之前,只有一个文本视图(标题)有一个返回过渡。为什么然后返回过渡开始从11项目,以及如何有这个过渡当然从第一个元素回收视图列表?
这是我的代码和解释。
我有一个recyclerview,它可以动态地为两个文本视图设置transitionname:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Note noteItem = noteItemList.get(position);
holder.noteTitleText.setText(noteItem.getNoteTitle());
ViewCompat.setTransitionName(holder.noteTitleText, "title" + position);
holder.noteDetailsText.setText(noteItem.getNoteDetails());
ViewCompat.setTransitionName(holder.noteDetailsText, "details" + position);
(...)
}
在这个适配器中,我有ViewHolder,在其中的父视图上,我像这样设置onclick:
rlNumberToGradient.setOnClickListener(view -> noteTitleDetailsOnClickAction());
其中
private void noteTitleDetailsOnClickAction() {
boolean edit = true;
if (fragment instanceof FragmentMain) {
list = db.getAllNotes();
isOnMove = ((FragmentMain) fragment).isOnMove;
} else if (fragment instanceof FragmentFav) {
list = db.getFavNotes();
} else if (fragment instanceof FragmentSearch) {
list = db.getSearchNotes(((FragmentSearch) fragment).onChange());
}
if (!isOnMove) {
Bundle bundle = new Bundle();
bundle.putBoolean("edit", edit);
bundle.putInt("position", list.get(getAdapterPosition()).getId());
((ActivityMain) fragment.requireActivity()).onPassValuesToFragmentShowNote(bundle, noteTitleText, noteDetailsText);
}
isOnMove = false;
}
我不关心isOnMove
变量,为此,我们假设它始终为真。
一旦我点击了这个rlNumberToGradient
视图,就会调用main activity中的onPassValuesToFragmentShowNote
方法,如下所示:
@Override
public void onPassValuesToFragmentShowNote(Bundle bundle, TextView tvTitle, TextView tvDetails) {
bundle.putString("transition_name_title", ViewCompat.getTransitionName(tvTitle));
bundle.putString("title", tvTitle.getText().toString());
bundle.putString("transition_name_details", ViewCompat.getTransitionName(tvDetails));
bundle.putString("details", tvDetails.getText().toString());
fragmentShowNote.setArguments(bundle);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setReorderingAllowed(true);
ft.addSharedElement(tvTitle, ViewCompat.getTransitionName(tvTitle));
ft.addSharedElement(tvDetails, ViewCompat.getTransitionName(tvDetails));
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft.addToBackStack(fragmentShowNote.getClass().getSimpleName());
ft.replace(R.id.content_frame, fragmentShowNote);
ft.commit();
}
正如我们所看到的片段显示出来了。这里是关键代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
sp = PreferenceManager.getDefaultSharedPreferences(requireContext());
setSharedElementEnterTransition(TransitionInflater.from(requireContext()).inflateTransition(R.transition.change_image_transform));
setSharedElementReturnTransition(TransitionInflater.from(requireContext()).inflateTransition(R.transition.change_image_transform));
setExitTransition(TransitionInflater.from(requireContext()).inflateTransition(R.transition.change_image_transform));
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_show_note, container, false);
if (getArguments() != null) {
Bundle b = getArguments();
position = b.getInt("position");
transitionNameTitle = b.getString("transition_name_title");
title = b.getString("title");
transitionNameDetails = b.getString("transition_name_details");
details = b.getString("details");
}
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (((ActivityMain) requireActivity()).getSupportActionBar() != null) {
((ActivityMain) requireActivity()).getSupportActionBar().hide();
}
Toolbar toolbar = view.findViewById(R.id.toolbar);
ViewCompat.setTransitionName(toolbar, transitionNameTitle);
((ActivityMain) requireActivity()).setSupportActionBar(toolbar);
((AppBarLayout) view.findViewById(R.id.app_bar_layout)).setExpanded(true);
toolbar.setTitle(title);
TextView tvNoteDescValue = view.findViewById(R.id.note_desc_value);
ViewCompat.setTransitionName(tvNoteDescValue, transitionNameDetails);
tvNoteDescValue.setText(details);
}
1条答案
按热度按时间x8diyxa71#
解决了。原来是不兼容。我试着在工具栏和文本视图上设置转换。一旦我用这个方法从工具栏获得文本视图,一切都很好: