自定义视图调用startActivityForResult

kat*_*tit 13 android android-layout

我创建了自定义复合视图,其中包含拍摄照片的功能.

我这样称呼它(从视图):

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
((Activity)mContext).startActivityForResult(intent, index);
Run Code Online (Sandbox Code Playgroud)

这部分很好用.我不知道怎么做是如何onActivityResult在我的自定义视图中实现的?

或者我应该在Activity中捕获这个并重新路由到我的视图中?看起来不是很好的解决方案..

riw*_*nyk 13

你实际上可以这样做:

@Override
public void onClick(View v) {
    final FragmentManager fm = ((FragmentActivity) getContext()).getSupportFragmentManager();
    Fragment auxiliary = new Fragment() {
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            //DO WHATEVER YOU NEED
            super.onActivityResult(requestCode, resultCode, data);
            fm.beginTransaction().remove(this).commit();
        }
    };
    fm.beginTransaction().add(auxiliary, "FRAGMENT_TAG").commit();
    fm.executePendingTransactions();

    auxiliary.startActivityForResult(new Intent(getContext(), ToStartActivity.class), 3333);
}
Run Code Online (Sandbox Code Playgroud)

诀窍是使用辅助临时片段.

  • 这给我带来异常,Fragment必须是静态的而不是匿名类:/.但看起来很酷的解决方法:). (3认同)
  • 虽然它很好,但您假设上下文是FragmentActivity,在大多数情况下这可能是错误的. (2认同)

小智 8

作为最初的问题,我遇到了同样的问题.我知道你们都发布了工作解决方案,但是,所有解决方案都缺少一件事:封装.我的意思是 - 如果在一个活动中我有10个视图应该(在某些事件上)启动另一个活动,那么它应该是NORMAL,以便能够从需要该活动的视图中启动该新活动.你们都试图说服最好处理所有新的活动 - 比起为什么我们在每个视图中添加不同的逻辑.我们可能想要重新使用代码,并创建一个可以独立工作到我们使用它的自定义视图(工作可能包括显示另一个活动来选择某些东西).

我知道这是不可能的(或者还没有),并且清楚地证明Android SDK还没有准备好处理真正的大型应用程序.

如果你想要一个例子:在任何具有例如客户列表(应该是视图)的真实商业应用中,视图应该能够自己启动addcustomer活动,编辑客户活动等,独立于你放置的位置客户列表视图(控件) - 因为在大型应用程序中,您需要重新使用组件(您可能需要在订单产品活动,时间表活动等中显示客户列表控件).

一种可能的解决方案可能是: - 启动新活动(使用视图上下文(通常应该是父活动). - 在新活动关闭事件上,直接调用调用视图中的方法(取决于具体情况和可能性) :要么处理通常会在activityresult上运行的代码的静态,要么尝试将调用视图的实例传递给新活动,并执行相同的操作.这样,您可以处理新活动,而不会让包含活动以了解它的任何信息.


ina*_*ruk 1

没有办法onActivityResult从你的角度捕捉,只能从Activity

假设该Context对象是是不安全的Activity。一般来说,您不应该依赖这个事实。即使在视图的情况下看起来合理,您仍然应该仅使用通过Context接口可用的方法。Activity这是因为当您调用Activity特定函数时,您无法预测 , 上的所有副作用。