Android 嵌套共享元素的转换不是从预期位置开始的

Android 嵌套共享元素的转换不是从预期位置开始的,android,android-5.0-lollipop,Android,Android 5.0 Lollipop,TL;DR为什么这种转变不是从预期的地方开始的 也就是说,CardView所在的位置 平台/部门:Android Studio 1.0-RC2、TargetSdk 21、MinSdk 21、AppCompat-21.0.2、CardView-21.0.2、RecyclerView-21.0.2 测试日期:Genymotion Nexus 5棒棒糖预览版 代码(简化) 我有三个共同点: 资料来源: <CardView android:transitionName="cardView

TL;DR为什么这种转变不是从预期的地方开始的

也就是说,CardView所在的位置

平台/部门:Android Studio 1.0-RC2、TargetSdk 21、MinSdk 21、AppCompat-21.0.2、CardView-21.0.2、RecyclerView-21.0.2

测试日期:Genymotion Nexus 5棒棒糖预览版

代码(简化) 我有三个共同点:

资料来源:

<CardView
    android:transitionName="cardView">
    <ImageView
      android:transitionName="imageView">
    <TextView
      android:transitionName="textView">
HomeActivity执行以下操作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().requestFeature(android.view.Window.FEATURE_ACTIVITY_TRANSITIONS);
    // ..
    mRecyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override public void onItemClick(View view, int position) {
                Intent intent = new Intent(selfContext, DetailActivity.class);

                View imageView = view.findViewById(R.id.imageView);
                TextView textView = (TextView)view.findViewById(R.id.textView);

                Bundle extras = new Bundle();
                extras.putInt("position", position);
                extras.putString("text", textView.getText().toString());
                intent.putExtras(extras);
                String name = ViewCompat.getTransitionName(view);
                ActivityOptionsCompat options =
                    ActivityOptionsCompat.makeSceneTransitionAnimation(selfContext
                            ,Pair.create(view, ViewCompat.getTransitionName(view))
                            ,Pair.create(imageView, ViewCompat.getTransitionName(imageView))
                            ,Pair.create((View)textView, ViewCompat.getTransitionName(textView))
                    );
                ActivityCompat.startActivity(selfContext, intent, options.toBundle());
            }
        })
    );
    ///...
}
DetailActivity执行以下操作:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    //...
    ViewCompat.setTransitionName(viewHolder.mCardView, "cardViewTransition" + position);
    ViewCompat.setTransitionName(viewHolder.mImageView, "imageTransition" + position);
    ViewCompat.setTransitionName(viewHolder.mTextView, "textTransition" + position);
    //...
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().requestFeature(android.view.Window.FEATURE_ACTIVITY_TRANSITIONS);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // ...

    Bundle extras = getIntent().getExtras();
    int mPositionRef = extras.getInt("position");
    View base = findViewById(R.id.detail_layout);
    View image = findViewById(R.id.imageView);
    TextView text = (TextView) findViewById(R.id.txtLabel);
    text.setText(extras.getString("text"));

    ViewCompat.setTransitionName(base, "cardViewTransition" + mPositionRef);
    ViewCompat.setTransitionName(image, "imageTransition" + mPositionRef);
    ViewCompat.setTransitionName(text, "textTransition" + mPositionRef);

}
我调试和共享的元素在源和目标中具有相同的名称

问题(再次) 为什么这种转变不是从预期的地方开始的?也就是说,CardView所在的位置


完整示例在

中棒棒糖中有一个已知错误与嵌套的共享元素相关(即,同时添加视图组及其一个子元素作为共享元素),因此可能与此相关(来源:)


尝试只将ImageView和TextView添加为共享元素(而不是父相对布局容器)。

可能是所有项目都具有完全相同的转换,因为它们都使用相同的名称。您可以使用本教程()中的方法在onBindViewHolder()中以编程方式设置唯一的转换名称:


棒棒糖中存在与嵌套共享元素相关的已知错误(即同时添加视图组及其一个子项作为共享元素),因此可能与此相关(来源:)。请尝试仅添加
ImageView
TextView
作为共享元素(而不是父相对布局容器).@AlexLockwood是的!今天你是我的英雄。嗯,听起来这个答案对你有用。:)我将添加它作为一个答案,而不是一个评论。。。除非你还有其他问题。还有,很好的“英雄”双关语:将ImageView和TextView填充为共享元素仍然会产生相同的问题。有什么帮助吗
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().requestFeature(android.view.Window.FEATURE_ACTIVITY_TRANSITIONS);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // ...

    Bundle extras = getIntent().getExtras();
    int mPositionRef = extras.getInt("position");
    View base = findViewById(R.id.detail_layout);
    View image = findViewById(R.id.imageView);
    TextView text = (TextView) findViewById(R.id.txtLabel);
    text.setText(extras.getString("text"));

    ViewCompat.setTransitionName(base, "cardViewTransition" + mPositionRef);
    ViewCompat.setTransitionName(image, "imageTransition" + mPositionRef);
    ViewCompat.setTransitionName(text, "textTransition" + mPositionRef);

}
ViewCompat.setTransitionName(
    holder.mySharedView, 
    "item_" + String.valueOf(sharedItem.getId()
);