2016-07-07 76 views
6

我有全局应用程序中的订阅源数据列表。 我MainAcitivty结束活动中的自定义共享元素转换

// selected item event 
Intent intent = new Intent(this, DetailActivity.class); 
intent.putExtra("item_feed_index", selectedItemIndex); 
FeedViewHolder viewHolder = getViewHolderFromPosition(position); 
Pair<View, String> pair1 = Pair.create(viewHolder.imageView, "TransitionName.Feed.Image"); 
Pair<View, String> pair2 = Pair.create(viewHolder.textView, "TransitionName.Feed.Text"); 
Pair<View, String> pair3 = Pair.create(viewHolder.button, "TransitionName.Feed.Button"); 
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3); 
startActivity(intent, options.toBundle()); 

用这个代码,以使过渡从我RecyclerView它的工作。但问题是,在DetailActivity,我有另一个垂直列表,用户可以向下/向上滚动以更改列表中的Feed项目(这也改变了滚动索引)。

当从DetailActivity后退时,我希望退出动画转换在正确的查看Feed索引上执行。我怎样才能做到这一点?

这是MainActivity中的代码onActivityResult,它将回收卷动到正确的位置,但退出过渡动画不正确的位置。

int currentFeedIndex = Application.getInstance().getCurrentViewingFeed(); 
if (currentFeedIndex > 0 && currentFeedIndex < adapter.getItemCount()) { 
    if (gridLayoutManager != null) { 
     gridLayoutManager.scrollToPositionWithOffset(currentFeedIndex + 1, 0); 
    } 
} 

我在寻找退出运行动画之前改变对列表的方式

更新:这里是DetailActivity,在这里我给你转型名意见的布局

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/imgFeed" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:transitionName="TransitionName.Feed.Image" /> 

    <TextView 
     android:id="@+id/tvLogo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:transitionName="TransitionName.Feed.Text"/> 

    <Button 
     android:transitionName="TransitionName.Feed.Button" 
     android:id="@+id/btn" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="40dp" 
     android:layout_below="@+id/tvLogo"/> 
    </RelativeLayout> 
+1

你可以发布你是怎么分配的过渡代码名称到'DetailActivity'的视图? – rom4ek

+0

@ rom4ek我更新了代码 – R4j

回答

2

来电者活动:

String itemId; //set your item id here 

Intent intent = new Intent(this, DetailActivity.class); 
intent.putExtra("item_feed_index", selectedItemIndex); 
intent.putExtra("item_id", itemId); 

String imageViewTransitionName = "TransitionName.Feed.Image." + itemId; 
String textViewTransitionName = "TransitionName.Feed.Text." + itemId; 
String buttonTransitionName = "TransitionName.Feed.Button." + itemId; 

ViewCompat.setTransitionName(viewHolder.imageView, imageViewTransitionName); 
ViewCompat.setTransitionName(viewHolder.textView, textViewTransitionName); 
ViewCompat.setTransitionName(viewHolder.button, buttonTransitionName); 

Pair<View, String> pair1 = Pair.create(viewHolder.imageView, imageViewTransitionName); 
Pair<View, String> pair2 = Pair.create(viewHolder.textView, textViewTransitionName); 
Pair<View, String> pair3 = Pair.create(viewHolder.button, buttonTransitionName); 

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3); 
startActivity(intent, options.toBundle()); 

然后在您的目的地Activity中,您只需从Intent获得itemId并为每个视图设置正确的过渡名称。

String itemId = getIntent().getString("item_id"); 
String imageViewTransitionName = "TransitionName.Feed.Image." + itemId; 
String textViewTransitionName = "TransitionName.Feed.Text." + itemId; 
String buttonTransitionName = "TransitionName.Feed.Button." + itemId; 

ViewCompat.setTransitionName(findViewById(R.id.imageView), imageViewTransitionName); 
ViewCompat.setTransitionName(findViewById(R.id.textView), textViewTransitionName); 
ViewCompat.setTransitionName(findViewById(R.id.button), buttonTransitionName); 
+0

您不明白这一点。将动画从“MainActivity”输入到“DetailActivity”对于这些过渡名称是正确的。但在'DetailActivity'中,有一个viewpager切换到另一个项目(它改变了itemId)。我想要的是更新新的itemId退出动画时,从'DetailActivity'回按'MainActivity' – R4j

+1

@ R4j也许你可以发布一个小视频来解释你的问题,所以我们可以最终得到你:) – rom4ek

1

重写onBackPressed方法对你DetailActivity这样的:同样

@Override 
public void onBackPressed() { 
    supportFinishAfterTransition(); 
    super.onBackPressed(); 
} 

,请确保您已指定的退出过渡您styles.xml