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)) 
}