【问题标题】:Update source activity before exit transition在退出转换之前更新源活动
【发布时间】:2016-03-28 15:28:54
【问题描述】:

我需要关于活动之间转换的帮助:

我有两个活动 A 和 B,并且都有一个带有相同图像列表的 ViewPager。每个页面都有一个 ImageView,transitionName 等于​​​​​​​​image_x​​​​​​​​​​​页面索引。

A 开始调用 ActivityOptionsCompat.makeSceneTransitionAnimation 的活动 B,进入转换完全没问题。

问题如下:当我关闭activity B时,exit transition并没有在B的相同位置初始化activity A的view pager。

当用户关闭 B 时,后者在结果中设置当前页面位置。在活动 A 的onActivityResult 中,我调用了setCurrentItem,行为显示在 gif 中。

有没有办法在退出转换开始之前更新活动 A?

【问题讨论】:

  • 活动结果是最好的方法,因为你没有活动的对象,所以活动结果是实现它的最好方法。
  • @PratikGoyal 是的,但是以这种方式执行退出过渡就像 gif 中所示,而且非常糟糕。我希望看到退出转换就像开始转换(从 A 到 B)一样。
  • 如果在返回 A 时消除 viewPager 中的过渡动画会怎样(如果可能)?如果它立即改变,用户不会注意到。
  • @Nilzor 如果我在更改页面时删除了退出过渡和 viewpager 的动画,则没有问题。我想知道是否有办法避免这种解决方案。
  • 是的,我建议只是暂时删除它,这样当用户与之交互时,ViewPager 动画就会出现,但在系统返回时不会出现。但我想退出页面转换也会有问题,因为旧图像会显示几毫秒

标签: android android-viewpager android-animation android-transitions


【解决方案1】:

如果您在onActivityReenter 中使用setCurrentItem 而不是在onActivityResult 中(在您的ActivityA 中),您应该能够做到这一点。

请确保您:

  1. 在完成ActivityB之前,设置结果(使用setResult(int resultCode)setResult(int resultCode, Intent data)
  2. 调用supportFinishAfterTransition()(或finishAfterTransition())而不是常规的finish()来“关闭”ActivityB

总结:

ActivityB

public void close(){
    Intent data = new Intent();
    data.putExtra(KEY_CURRENT_ITEM, mFullscreenViewPager.getCurrentItem());
    setResult(RESULT_CODE, data);
    supportFinishAfterTransition();
}

ActivityA

@Override
public void onActivityReenter(int resultCode, Intent data) {
    super.onActivityReenter(resultCode, data);
    if (data.hasExtra(KEY_CURRENT_ITEM)){
         mViewPager.setCurrentItem(data.getIntExtra(KEY_CURRENT_ITEM, 0), false);
    }
}

【讨论】:

  • 您的答案似乎正确,但过渡仍然显示出奇怪的行为:giphy.com/gifs/d3l2J0f2o84YL0tO
  • 虽然没有解决问题,但这是正确的答案。
【解决方案2】:

我有解决办法。

1. 创建在两个 Activity 之间工作的接口类:demoClass.java

public class demoClass {

public static demoClass instance;
public demoInterface mCallback;

public static demoClass getInstance() {
    if(instance == null) {
        instance = new demoClass();
    }
    return instance;
}

public void setListener(demoInterface callback) {
    this.mCallback = callback;
}

public void changePage(int which) {
    if(this.mCallback != null) {
        this.mCallback.changePage(which);
    }
}


public interface demoInterface {
    public void changePage(int which);
}

}

2.从ActivityB,调用接口方法:

demoClass.getInstance().changePage(mFullscreenViewPager.getCurrentItem());

3.从ActivityA,实现接口并注册监听接口:

public class ActivityA extends Activity implements demoClass.demoInterface {
...
} 
---------------------
demoClass.getInstance().setListener(ActivityA.this);

4.A中实现changePage(int)方法:

@Override
public void changePage(int which) {
    mViewPager.setCurrentItem(page);
}

说明

当ActivityB改变页面时,向接口demoClass.demoInterfacedemoClass.getInstance().changePage(index)报告事件。这最终将调用 Activity A 的方法 changePage(int),我们将随时更改 ViewPager 内容。

结果

您可以在GIF here查看输出

【讨论】:

  • 好的,这是一个解决方案。但是如果系统出于某种原因释放了Activity A,它会起作用吗?
  • 是的...只是你需要保存page变量值,你可以在activity A重新启动时恢复。对于存储,您可以使用 SharedPreference...
  • 好的,我试试。谢谢!
  • 您的解决方案不能解决我的问题。行为仍然是这样的:giphy.com/gifs/d3l2J0f2o84YL0tOThanks
  • 请发布您的代码...因为同样的解决方案对我有用...如果您愿意,我可以分享代码示例...
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多