2

我正在開發一個項目,我需要使用共享元素的碎片之間的轉換。我已經嘗試幾乎所有的東西,但過渡效果不起作用。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的影響。我真的被困在這裏,所以什麼都歡迎。

在此先感謝

回答

0

我只是發現,當我在使用它的自定義arrayadapter更多的則1元,如果切換到正常的String數組爲我的ListView,它只會發生,一切工作正常,同如果我有一個自定義arrayadapter listview中只有1個元素,一切工作正常。

0

您需要爲列表中的每個元素設置唯一的過渡名稱。這裏有一個例子:

在適配器的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)) 
}