从静态方法调用startActivityForResult

时间:2012-09-03 14:56:23

标签: android

我有一个buttonlistener,当用户点击按钮时,我想启动一个相机意图。 目前我有这个:

public class ButtonListener implements View.OnClickListener 
{
private ArrayList<String> connectedItems;
private String identifier = null;
private Context context;
private EnteredValues enteredValues;

public ButtonListener(Context c, String identifier, ArrayList<String> connectedItems) {
    this.connectedItems = connectedItems;
    this.identifier = identifier;
    this.context = c;
}

public void onClick(View v) {
    if (identifier.equals(ButtonItem.takePhoto)) {
        MainActivity.takePhoto();
    }

}

现在我想在mainActivity中调用一个方法,并且我想启动startActivityForResult,但是我得到一个错误,我无法从静态方法调用startActivityForResult。

public class mainActivity extends Activity{
...
   public static void takePhoto(){
       startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE));
          break;

       //Here I get the error..
   }

}

解决此类问题的最佳做法是什么?将mainActivity对象传递给我的buttonListener还是有其他选项?

很多thx :)

5 个答案:

答案 0 :(得分:11)

不要使用Application上下文 - 因为它会破坏您的ActivityStack。 我建议将Activity参数添加到此静态方法:

public static void takePhoto(Activity activity, int requestCode){
   activity.startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), requestCode);
}

只是从你的监听器传递Activity。您必须将Activity实例传递给它,而不是简单的Context,因为只有Activity可以进行startActivityForResult()次调用。

因此clickListener代码将更改如下:     公共类ButtonListener实现View.OnClickListener     {     private ArrayList connectedItems;     private String identifier = null;     私人活动活动;     私人EnteredValues进入了值;

public ButtonListener(Activity activity, String identifier, ArrayList<String> connectedItems) {
    this.connectedItems = connectedItems;
    this.identifier = identifier;
    this.activity = activity;
}

public void onClick(View v) {
    if (identifier.equals(ButtonItem.takePhoto)) {
        MainActivity.takePhoto(activity, 100);
    }
} 

这是一个很好的做法,可以使这些静态助手避免从代码的不同部分创建意图和startActivities。

祝你好运。

答案 1 :(得分:0)

按钮监听器中的上下文很可能是您的活动或属于您的活动的内容。尝试从中开始下一个活动。

答案 2 :(得分:0)

使用mainActivity.this.startActivityForResult(...)

答案 3 :(得分:0)

您可以使用this(或MainActivity.this)将MainActivity作为上下文传递给静态方法,然后将其强制转换为Activity。这不会破坏您的ActivityStack。

在您的情况下,请使用以下命令在MainActivity中创建点击侦听器:

new ButtonListener(this, "abc", null)
new ButtonListener(MainActivity.this, "abc", null) // in a nested class or constructor

然后在ButtonListener中传递上下文:

MainActivity.takePhoto(context);

最后进入MainActivity:

public static void takePhoto(Context context){
   ((Activity)context).startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), 123);
}

答案 4 :(得分:-1)

您可以使用 application context

getApplicationContext()