Как я могу вызвать закрытый для пакета метод в 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;
}