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

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

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

我正在寻找这样的东西:

myActivity.setOnActivityResult...

谢谢!

【问题讨论】:

  • 不要这样做。如果你还想这样做,请仔细研究一下Activity的生命周期,然后不要这样做
  • 请试试我的回答,告诉我它是否适合你;)

标签: android onactivityresult


【解决方案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://stackoverflow.com/a/21780532/3818437

      【讨论】:

      • 我没用过这个方法,但是我用了差不多这样的方法,效果很好!
      • 实现接口不是比静态方法更好吗?
      • @abarazal 是的,最好避免使用静态方法
      猜你喜欢
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多