1

次のスニペットは、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); 
    } 
    ... 
} 

答えて

1

あなたが(ちょうどコンストラクタ本体の前に実行)クラス本体にbaseLoaderCallbackを初期化しているにもかかわらず、コールバックのonManagerConnectedOpenCVLoader.initAsync完了するまで、そうではないonResumeまで呼び出されません。

あなたは(それがnullを返しますので)onAttachgetActivity()を呼び出さないようにしたい場合は、ちょうどあなたが本当にそれまでそれを必要としないので、onResumebaseLoaderCallbackのための初期化子を入れました。

+0

ええ、 'getActivity()'はその時点(コンストラクタの前)で呼び出され、 'getActivity()'は 'onActivityCreated()'の前に呼び出されてはいけません - _that_が問題です。 – Solace

+0

そこにはアプリケーションコンテキストが必要なため、 'getActivity()'が呼び出されています。 – Solace

+0

ああ、私は私の答えを更新しました。 'onResume'で' initAsync'を呼び出すのが良ければ、 'baseLoaderCallback'だけを初期化してください。 – szym

関連する問題