次のスニペットは、OpenCV4AndroidがActivity
でどのように初期化されるかを示しています。 this sample appにありますが、Fragment
(私のJavaCameraView
が私の一部になっているため)の中でそれを行う必要があります。フラグメント内で、OpenCV4Androidを初期化する正しい場所は何ですか?
私はActivity
で行ったようにします。すなわち、baseLoaderCallback
をクラス本体の内側(メソッドの本体の外側)に直接初期化しますが、このように初期化コード(次のスニペットの4番目のステートメント)はFragment
がインスタンス化されるとすぐに実行されます。私たちが見ることができるように
は、BaseLoaderCallback
コンストラクタは、引数としてアプリケーションコンテキストを取り、私はonActivityCreated()
前getActivity()
はonActivityCreated()
前に、getActivity()
はnullを返すことができるので、呼ばれて呼び出すことはできません。
public class AnActivity extends Activity implements CvCameraViewListener2 {
...
private JavaCameraView javaCameraView;
...
private CameraBridgeViewBase cameraBridgeViewBase;
BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(getActivity().getApplicationContext()) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
cameraBridgeViewBase.enableView();
break;
default:
super.onManagerConnected(status);
break;
}
}
};
...
//SOME LIFE CYCLE CALL BACK METHODS
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, getActivity().getApplicationContext(),
baseLoaderCallback);
}
...
}
ええ、 'getActivity()'はその時点(コンストラクタの前)で呼び出され、 'getActivity()'は 'onActivityCreated()'の前に呼び出されてはいけません - _that_が問題です。 – Solace
そこにはアプリケーションコンテキストが必要なため、 'getActivity()'が呼び出されています。 – Solace
ああ、私は私の答えを更新しました。 'onResume'で' initAsync'を呼び出すのが良ければ、 'baseLoaderCallback'だけを初期化してください。 – szym