0

我的 Activity 类中有一个非静态的包私有方法,我想在 SurfaceView 中调用它,例如:surfaceChanged() 或 surfaceDestroyed()。

    public class MyActivity extends Activity {

Camera mCamera = Camera.open();
Camera.Parameters parameters = mCamera.getParameters();
boolean hasFlash = false;
...
    void destroyCamera() {
    flashOff();
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
}

void updateCamera() {
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}
...
class CameraView extends SurfaceView implements SurfaceHolder.Callback {
...
    public void surfaceDestroyed(SurfaceHolder holder) {
    destroyCamera();
}
...

有一个更好的方法吗?我在同一个活动中也有一个 toggleFlash() 方法,因此我可以通过关键侦听器在活动中切换闪光灯。

4

1 回答 1

0

要回答您的评论 - 是的,您可以将 传递给Activity构造函数来代替context

SurfaceView view = new SurfaceView(this);

然后,只要您确定contextActivity,就可以将其强制转换为 anActivity以调用该方法:

//call inside the view
((MyActivity) getContext()).methodToCall(); 

其他选项包括提供对您的静态引用Activity,或通过弱引用静态访问您的活动,例如:

public static WeakReference<MyActitivity> getActivity(){
    return new WeakReference<MyActivity>(self);// self is a static instance of MyActivity
}

您可以通过在或默认构造函数Activity中分配它来获得对您的静态引用:onCreate

private static MyActivity self;

public MyActivity()
{
    super();
    self = this;
}
于 2013-03-01T01:08:43.100 回答