android - 在新 Activity 中从一个 fragment 到另一个 fragment 的共享元素转换

标签 android android-fragments material-design android-transitions

我正在开发一个应用程序,该应用程序目前在 ImageView 上使用同一 Activity 中从一个 fragment 到另一个 fragment 的内容转换。它工作正常,但我意识到我的目标 fragment 需要有自己的 Activity 。

假设我有 Activity A,其中包含 fragment 1 我有 Activity B,其中包含 Fragment 2。 我需要执行从 Fragment 1Fragment 2 的共享元素转换。

这是我到目前为止所做的: 在从 Fragment 1 到 Activity A 的回调方法中,我传递了选定的实体以及我要从中转换的 ImageView 。

Activity A

 @Override
public void OnPhotographSelected(Photograph selectedPhoto,ImageView image) {
    Intent i= new Intent(this, PhotoDetailActivity.class);
    i.putExtra("photo_OBJ", selectedPhoto);
    i.putExtra("transitionName", image.getTransitionName());
    startActivity(i, ActivityOptions.makeSceneTransitionAnimation(this, image, "mainPhoto").toBundle());
}

Activity B

 @Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_photo_detail);
    Photograph photoObj=new Photograph();
    Bundle b = getIntent().getExtras();
    String transitionName="";
    if(b!=null)
    {
        photoObj=(Photograph)b.getSerializable("photo_OBJ");
        transitionName=b.getString("transitionName");
    }
    PhotoDetailFragment pdf = PhotoDetailFragment.newInstance(photoObj);
    pdf.setSharedElementReturnTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));
    pdf.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));
    pdf.setImageTransitionId(transitionName);
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
    trans.replace(R.id.photo_detail_content, pdf);
    trans.commit();
}

fragment 2

 mainImg.setTransitionName(mImageTransitionID);

Activity 主题

 <item name="android:windowActivityTransitions">true</item>

我没有看到在运行时发生任何内容转换。正如我之前提到的,我在同一个 Activity 中正确地实现了从一个 fragment 到另一个 fragment 的转换。 另外值得注意的是, fragment 1 是一个 GridView ,所以我必须自己维护 transitionNames,这样它们都是唯一的,这就是为什么您会在运行时看到 setTransitionName 调用。

知道为什么我没有看到转换运行吗?

最佳答案

尝试在 onCreate() 中的第二个 Activity 中使用 postponeEnterTransition() 并在创建后的 fragment 中使用 yourActivity.startPostponedEnterTransition()您在 onViewCreated() 中的 View 。

如果您正在使用 AppCompat,请尝试 supportPostponeEnterTransition()supportStartPostponedEnterTransition()ActivityCompat.postponeEnterTransition(yourActivity)ActivityCompat.startPostponedEnterTransition(yourActivity)

归功于: http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

关于android - 在新 Activity 中从一个 fragment 到另一个 fragment 的共享元素转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903082/

相关文章:

android - TextView 的 onFling 不起作用

android - onDataChanged 只调用一次?

android - Fragment 的 onCreate 和 onCreateView 没有被调用

android - 无法使用 fragment 播放多个视频

css - 在 Angular 2 Material 中将 md-tab-group body min height 更改为 0

Angular 2 和 Material Designs - 示例对话框为空

android - 在绘制之后但在 onDraw() 完成之前修改位图

android - 在Android中缩放/最小化YoutubePlayerView时调整视频大小

android - 尽管调用了 addToBackStack(null),但 Fragment BackStack 不起作用

html - 如何从Google的Material Design图标外部删除间距?