如何在另一个类中使用 onActivityResult

Posted

技术标签:

【中文标题】如何在另一个类中使用 onActivityResult【英文标题】:How to use onActivityResult in another class 【发布时间】:2016-04-13 23:51:21 【问题描述】:

我想在一个不扩展活动但这个类有一个全局变量作为活动实例的类中使用 onActivityResult。这个类和这个类似:

public class myClass()
    public Activity myActivity;
    .
    .
    .
    // I want to add onMyActivityResult here

我正在寻找这样的东西:

myActivity.setOnActivityResult...

谢谢!

【问题讨论】:

参考***.com/questions/21780252/… 不要这样做。如果你还想这样做,请仔细研究一下Activity的生命周期,然后不要这样做 请试试我的回答,告诉我它是否适合你;) 【参考方案1】:
public class MyActivity extends Activity 

    public interface IResult 
        void call(Intent data);
    

    public IResult r;


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != RESULT_OK) return;
        if (r == null) return;

        r.call(data);
    

    void startZ()  Z.startZ(this); 
    void startY()  Y.startY(this); 

Z

class Z 
    public static void startZ(MyActivity a) 
        a.r = data -> 
            //...YOUR CODE HERE...
        ;

        a.startActivityForResult(
                new Intent(a, ZActivity.class),
                request_code___not_needed_because_only_one_activity_lives);
    

是的

class Y 
    public static void startY(MyActivity a) 
        a.r = data -> 
            //...YOUR CODE HERE...
        ;

        a.startActivityForResult(
                new Intent(a, YActivity.class),
                request_code___not_needed_because_only_one_activity_lives);
    

【讨论】:

【参考方案2】:

这无法覆盖实例 onActivityResult(),但可以按照以下方式进行。 主要思想是创建您的类,该类在代码中调用您的自定义函数; 在这种情况下

也就是说,你的 Activity 类必须由 ABase 而不是 Activity 扩展:

public class yourClass extends ABase
//your usual code is here.

然后,ABase 看起来像这样:

public class ABase extends Activity 
private Callable<Void> clb;//this function will be called
protected void onActivityResult(int requestCode, int resultCode,
                Intent data) 
                super.onActivityResult(requestCode, resultCode, data);
                if (clb != null) 
                        try 
                        clb.call();
                     catch (Exception e) 
                        e.printStackTrace();
                    
                

public void setMyCallable(Callable<Void> callable)
this.clb = callable;


在您的公共 myClass 中使用 public ABase 代替 public Activity act; 例如有一个setSomeFunction() 可以使用:

public class myClass 
public ABase act;
public static setSomeFunction() 
    if (act != null) 
        Callable<Void> clb = new Callable<Void>() 
                @Override
                public Void call() throws Exception 
                    Log.d(TAG, "is Called!");
                    return null;
                
            
        act.setMyCallable(clb);

        
    

【讨论】:

【参考方案3】:

您可以执行以下操作

public class myClass()

    public static void activityResult(int requestCode, int resultCode, Intent data)

          //right your code here .
   

并在您的 CLASS EXTENDS ACTIVITY 中将其写入 onActivityResult 方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
       myClass.activityResult(requestCode,resultCode,data);
    

感谢这个答案:https://***.com/a/21780532/3818437

【讨论】:

我没用过这个方法,但是我用了差不多这样的方法,效果很好! 实现接口不是比静态方法更好吗? @abarazal 是的,最好避免使用静态方法

以上是关于如何在另一个类中使用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个类中使用带有构造函数的类?

如何导入和使用在另一个python程序的类中定义的变量?

如何在另一个类中调用一个类中的函数对象?

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中

如何在另一个类中调用类类型的向量?

如何在另一个类中调用一个类的 main() 方法?