Android:与碎片共享元素转换
问题描述:
我正在开发一个项目,我需要使用共享元素的碎片之间的转换。我已经尝试几乎所有的东西,但过渡效果不起作用。Android:与碎片共享元素转换
我有一个名为TimelineActivity的活动,我有2个片段,一个动态添加到TimelineActivity的ListFragment和一个DetailFragment。
每当我点击ListFragment中ListView中的一个项目时,碎片就被DetailFragment替换。
@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();
}
在我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>
要清楚的是,碎片被替换,这是工作正常,但没有changebounds的影响。我真的被困在这里,所以什么都欢迎。
在此先感谢
答
我只是发现,当我在使用它的自定义arrayadapter更多的则1元,如果切换到正常的String数组为我的ListView,它只会发生,一切工作正常,同如果我有一个自定义arrayadapter listview中只有1个元素,一切工作正常。
答
您需要为列表中的每个元素设置唯一的过渡名称。这里有一个例子:
在适配器的getView方法设置过渡名称:在DetailFragment的onCreateView方法设置过渡名称
@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)...
}
查看::
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// your code...
sharedView.setTransitionName(String.valueOf("transition_name_") + position);
}
在onItemClick方法发送转换名DetailFragment
@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))
}