【问题标题】:Android: Shared Element Transition with FragmentsAndroid:带有片段的共享元素转换
【发布时间】:2016-11-08 18:08:22
【问题描述】:

我正在做一个项目,我需要使用共享元素在片段之间进行过渡。我几乎尝试了所有方法,但过渡效果不起作用。

我有一个名为 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 中,这是我拥有的列表视图的布局:

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

为了清楚起见,片段被替换了,这工作正常,但没有变化边界效果。我真的被困在这里,所以欢迎任何事情。

提前致谢

【问题讨论】:

    标签: android android-fragments android-transitions shared-element-transition


    【解决方案1】:

    您需要为列表中的每个元素设置唯一的过渡名称。这是一个例子:

    在适配器的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方法中设置transition name to 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))
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚发现只有当我使用包含超过 1 个元素的自定义 arrayadapter 时才会发生这种情况,如果我切换到我的 ListView 的普通字符串数组,一切正常,如果我只有 1 个元素在我的带有自定义数组适配器的列表视图,一切正常。

      【讨论】:

        猜你喜欢
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2015-01-10
        相关资源
        最近更新 更多