Как я могу вызвать закрытый для пакета метод в Activity из SurfaceView?

У меня есть нестатический, закрытый для пакета метод в моем классе 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() в том же упражнении, поэтому я могу переключать вспышку изнутри занятия через ключевых слушателей.

1 ответ

Чтобы ответить на ваш комментарий - да, вы можете передать Activity в конструктор вместо context:

SurfaceView view = new SurfaceView(this);

Тогда, если вы уверены, context это ActivityВы можете привести его к Activity чтобы вызвать метод:

//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;
}
Другие вопросы по тегам