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);

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;
}
于 2013-03-01T01:08:43.100 に答える