Android:带有片段的共享元素转换
我正在进行一个项目,需要使用共享元素在片段之间进行转换。我几乎什么都试过了,但是过渡效果不起作用 我有一个名为TimelineActivity的活动,我有两个片段,一个动态添加到TimelineActivity的ListFragment和一个DetailFragment 每当我在ListFragment中单击ListView中的某个项目时,该片段就会被DetailFragment替换Android:带有片段的共享元素转换,android,android-fragments,android-transitions,shared-element-transition,Android,Android Fragments,Android Transitions,Shared Element Transition,我正在进行一个项目,需要使用共享元素在片段之间进行转换。我几乎什么都试过了,但是过渡效果不起作用 我有一个名为TimelineActivity的活动,我有两个片段,一个动态添加到TimelineActivity的ListFragment和一个DetailFragment 每当我在ListFragment中单击ListView中的某个项目时,该片段就会被DetailFragment替换 @Override public void onItemClick(AdapterView<?> p
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
DetailFragment fragment = DetailFragment.newInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fragment.setSharedElementEnterTransition(new ChangeBounds().setDuration(2000));
fragment.setEnterTransition(new ChangeBounds().setDuration(2000));
setExitTransition(new ChangeBounds().setDuration(2000));
fragment.setSharedElementReturnTransition(new ChangeBounds().setDuration(2000));
}
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
fragment.setAllowEnterTransitionOverlap(true);
fragment.setAllowReturnTransitionOverlap(true);
ft.replace(R.id.timeline_container, fragment);
ft.addSharedElement(view.findViewById(R.id.transition), "selectClientTransition");
ft.addToBackStack(null);
// Start the animated transition.
ft.commit();
}
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
DetailFragment=DetailFragment.newInstance();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
fragment.setShareDeletentertransformation(newchangebounds().setDuration(2000));
fragment.setEnterTransition(newchangeBounds().setDuration(2000));
setExitTransition(newchangeBounds().setDuration(2000));
fragment.setSharedElementReturnTransition(newchangeBounds().setDuration(2000));
}
FragmentTransaction ft=getActivity().getSupportFragmentManager().beginTransaction();
fragment.setAllowInterTransitionOverlap(true);
fragment.setAllowReturnTransitionOverlap(true);
ft.replace(R.id.U容器、碎片);
ft.addSharedElement(view.findViewById(R.id.transition),“selectClientTransition”);
ft.addToBackStack(空);
//开始动画过渡。
ft.commit();
}
在我的listview_row.xml中,这是我的listview布局:
<LinearLayout
android:id="@+id/transition"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF"
android:orientation="vertical"
android:padding="10dp"
android:transitionName="selectClientTransition">
</LinearLayout>
在我的fragment_detail.xml中,我有以下内容:
<LinearLayout
android:id="@+id/transition"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF"
android:orientation="vertical"
android:padding="10dp"
android:transitionName="selectClientTransition"
android:weightSum="12">
</LinearLayout>
我将此添加到我的AppTheme中
<item name="android:windowContentTransitions">true</item>
true
需要明确的是,片段被替换,这很好,但没有changebounds效果。我真的被困在这里了,所以什么都欢迎
提前感谢我刚刚发现,只有当我使用一个自定义arrayadapter,其中包含超过1个元素时,才会发生这种情况。如果我为我的ListView切换到一个普通的字符串数组,一切都可以正常工作,同样,如果我的ListView中只有1个元素和一个自定义arrayadapter,一切都可以正常工作 您需要为列表中的每个元素设置唯一的转换名称。下面是一个例子: 在适配器的getView方法中设置转换名称:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// your code...
sharedView.setTransitionName("transition_name_" + position);
}
在onItemClick方法中,将转换名称发送到DetailFragment:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
DetailFragment fragment = DetailFragment.newInstance();
View sharedView = v.findViewById(R.id.shared_view);
Bundle arguments = new Bundle();
arguments.putString(DetailFragment.TRANSITION_NAME, sharedView.getTransitionName());
fragment.setArguments(arguments);
// the rest of your code (replacing fragments, etc)...
}
在DetailFragment的onCreateView方法中,将转换名称设置为view:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// your code...
View sharedView = inflatedLayout.findViewById(R.id.shared_view);
sharedView.setTransitionName(getArguments().getString(TRANSITION_NAME))
}