【问题标题】:startActivityForResult out an activitystartActivityForResult 出一个活动
【发布时间】:2014-10-09 13:34:31
【问题描述】:

如何在常规 java 类中的活动上下文之外使用 startActivityForResult

前: 在主要活动中,我调用了 SampleClass 的方法。在这种方法中,我必须打开设备相机并获取图像并进行处理。

问题是控件没有转到 SampleClass 内的 onActivityResult 回调方法,而是转到 MainActivity 内的 onActivityResult 回调方法。我做错了什么?

我只需要能够处理示例类中的图像。我怎样才能做到这一点

代码片段

主要活动:

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
...
...

    SampleClass sample = new Sample(this);   
    sample.openCamera();
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 0){
        if(resultCode == RESULT_OK){
            syso("INSIDE MAIN ACTIVITY");
        }

        if(resultCode == RESULT_CANCELED){
            ...
        }
    }
}

}

示例类:

public class SampleClass extends Activity{

private Context context;

public SampleClass(Context context){
    this.context = context;
}

public void openCamera(){
    Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    ((Activity) context).startActivityForResult(photoIntent, 0);
}

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

    if(requestCode == 0){
        if(resultCode == RESULT_OK){
            //get the image 
            // process it.

            syso("INSIDE SAMPLE CLASS");
        }

        if(resultCode == RESULT_CANCELED){

        }
    }
}

}

如果我运行这个程序,控制台上的输出是 INSIDE MAIN ACTIVITY。我想要的是能够获得 INSIDE SAMPLE CLASS 作为输出。

感谢和问候

【问题讨论】:

  • 向我们展示 openCamera();

标签: java android android-camera-intent


【解决方案1】:

而不是使用

 SampleClass sample = new Sample(this);   
sample.openCamera();

只是使用

Intent intent = new Intent(this, SampleClass .class); 

并编写 SampleClass onCreate 调用 openCamera()。

希望这会有所帮助。

【讨论】:

  • 这意味着我在清单中添加了 sampleclass。正确的 ?我试图避免这种情况!
  • 是的,因为您是作为活动创建的。只有调用 startActivityForResult 的活动才会得到回调。在你的情况下它的 SampleClass。
  • 您通常不应该使用构造函数创建活动,而是按照建议使用意图。因为 SampleClass 不是一个经过充分生命周期的有效注册的 Activity,所以很清楚为什么会触发 MainActivity 的回调方法。如果你想触发 SampleClass 的回调,你必须使用一个意图来创建它!
  • 感谢您的快速回复。我理解您的论点。我想做的就是让相机作为一个模块发挥作用。这样做有什么选择?
  • 您可以在某个类上创建单独的静态函数并从 onActivityresult 方法调用。如果对您有帮助,请采纳答案
【解决方案2】:

问题是您使用 MainActivity Context 打开相机! 肯定会触发 MainACtivity 的 onActivityResult()。

((Activity) context).startActivityForResult(photoIntent, 0);

查看上下文对象 = MainActivity 检查您的 SimpleClass 构造函数。

public SampleClass(Context context){
// when you call from mainActivity and send **this** it means context = MainActivty
this.context = context;
} 

如果您希望触发 SampleClass onActivityResult(),则无法扩展 Activity 然后像平常一样调用它....

Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
context.startActivityForResult(photoIntent, 0);    // context must = SampleClass (); no other way

但如果您仍想在 SimpleClass 中处理图像,请按照此代码删除扩展 Activity

SimpleClass

public static void onActivityResult(int requestCode, int resultCode, Intent data) {

  if(requestCode == 0){
     if(resultCode == RESULT_OK){
        //get the image 
        // process it.

        syso("INSIDE SAMPLE CLASS");
     }

      if(resultCode == RESULT_CANCELED){

      }
   }
}

在你的 MainActivity 类中

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    SimpleClass.onActivityResult(requestCode,resultCode,data);
}

永远不要使用新关键字从活动中创建新对象 Adnroid OS 会在您说时为您做到这一点

 Itnent foo = new(context,foo.class);

如果你这样做了,也许这意味着破解代码和安卓操作系统。

希望您能理解并希望对您有所帮助

【讨论】:

  • 谢谢..我会试试这个..我知道这是糟糕的编程,但我必须尝试这些黑客,因为我不想使用意图和活动。我不知道……我可能需要重新评估我做出这个决定的原因!
  • 是什么促使您避免意图和活动?
  • @iZBasit 在主要活动中,我有一些 UI 元素和一个专用的屏幕部分(相对布局 100 X 100)由 SampleClass 控制(即)我传递了这部分的参考到 SampleClass。 SampleClass 在该部分中添加 UI 并控制该部分中的所有交互。主要活动的 UI 的其余部分不受干扰。如果我使用 Intents,我可以将 UI 元素嵌入到 Main Activity 中吗?我不知道该怎么做,因此最终选择了这种方法。有没有更好的方法来实现这一目标?上面的ex只是一个说明,并不是真正的用法
  • 片段是一种选择吗?
【解决方案3】:

这是不可能的。 onActivityResuly 将在该活动上被调用,该活动已运行另一个活动。

所以如果你拿activity1实例运行另一个activity,另一个activity会调用activity1.onActivityResult()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多