在退出转换之前更新源活动

16

enter image description here

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

我有两个活动A和B,它们都有一个ViewPager,其中包含相同的图像列表。每个页面都有一个ImageView,其中transitionName等于image_x,其中x是页面索引。

A通过调用ActivityOptionsCompat.makeSceneTransitionAnimation启动活动B,并且进入转换完全正常。

问题如下:当我关闭活动B时,退出转换不会将活动A的视图页初始化到与B相同的位置。

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

是否有一种方法可以在退出转换开始之前更新活动A?


活动结果是实现这一点的最佳方式,因为您没有活动对象,所以活动结果是最好的实现方式。 - Pratik Goyal
@PratikGoyal 是的,但是这样做的话,退出过渡效果就像gif中展示的那样,非常糟糕。我希望看到退出过渡效果与开始过渡效果(从A到B)一样。 - fran
@Nilzor 如果我移除页面切换时的退出过渡和viewpager的动画,就不会出现问题。我想知道是否有避免这种解决方案的方法。 - fran
@fran:你可以在A和B之间使用“接口”。当你在B中获取页面更改事件时,通过“接口”将事件传递到A活动。 - Kushal
@fran 我已解决了您的问题... 请检查我的答案... 我使用了“接口”概念来解决... 希望这能帮到您。 - Kushal
显示剩余2条评论
2个回答

7
如果您在ActivityB中使用onActivityResult设置当前项目,而不是在onActivityReenter中使用setCurrentItem,则应该能够实现效果。
只需确保您:
  1. 在完成ActivityB之前,设置结果(使用setResult(int resultCode)setResult(int resultCode, Intent data)
  2. 调用supportFinishAfterTransition()(或finishAfterTransition())来“关闭”ActivityB,而不是常规的finish()

总而言之:
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);
    }
}

你的回答似乎是正确的,但是转换仍然表现出奇怪的行为:http://giphy.com/gifs/d3l2J0f2o84YL0tO - fran
虽然它没有解决问题,但这是正确的答案。 - rciovati

0

我已经找到了解决方案。

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. 从活动 B 中调用接口方法:

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

3. 从活动 A,实现接口并注册监听接口:

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);
}

说明

当活动 B 更改页面时,通过 demoClass.getInstance().changePage(index) 向接口 demoClass.demoInterface 报告事件。这将最终调用活动 A 的方法 changePage(int),并且我们将在运行时更改 ViewPager 内容。

结果

您可以在 此处的GIF 中检查输出。


好的,这是一个解决方案。但是如果系统因某种原因释放了活动A,它还能工作吗? - fran
是的...只需要保存“page”变量的值,当A活动重新启动时,您可以恢复它。为了存储,您可以使用SharedPreference... - Kushal
好的,我会尝试。谢谢! - fran
你的解决方案并没有解决我的问题。行为仍然是这样的:http://giphy.com/gifs/d3l2J0f2o84YL0tO 谢谢。 - fran
从 gif 中可以看出,您正在从 Activity A 的某个位置重置 mViewPager.setCurrentPage... 因此,在转到 Activity A 时,页面 5 将更改为页面 3... 请发布您的代码,以便我可以帮助。 - Kushal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接