4

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

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 还是有其他选项?

很多谢谢 :)

4

5 回答 5

13

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

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

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

所以 clickListener 代码会改变如下: public class ButtonListener implements View.OnClickListener { private ArrayList connectedItems; 私有字符串标识符 = null; 私人活动活动;私人输入值输入值;

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 是一种很好的做法。

祝你好运。

于 2012-09-03T15:05:05.477 回答
1

this您可以使用(或)将 MainActivity 作为上下文传递给静态方法,MainActivity.this然后将其转换为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);
}
于 2018-11-18T20:59:09.423 回答
0

您的按钮侦听器中的上下文很可能是您的活动或属于您的活动的东西。尝试从它开始你的下一个活动。

于 2012-09-03T14:57:47.123 回答
0

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

于 2012-09-03T14:58:28.543 回答
-1

您可以使用应用程序上下文

getApplicationContext()
于 2012-09-03T15:01:55.367 回答