我有一个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 :)
答案 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()