2017-11-27 4 views
0

コールバックを別のクラスに送信することはできますか?googleAPIClient接続コールバックを別のクラスに送信することはできますか?

私は次のようにアプリケーションのクラスがあります。

public class MyApp extends Application { 
    private GoogleApiClient mGoogleApiClient; 

    public MyApp(){ 
     // bla... and initialize google client here... 
     this.mGoogleApiClient = new GoogleApiClient.Builder(this.getApplicationContext()) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, this.GSO()).build(); 
    } 
} 

を、私は次のようにメインクラスがあります。以下のよう

public class MyActivity extends AppCompatActivity { 
    private MyApp app; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     app = (MyApp) this.getApplication(); 
    } 

    protected void onStart(){ 
     super.onStart(); 

     GoogleApiClientUtility googleApiClientUtility = new GoogleApiClientUtility(app, new GoogleApiClient.ConnectionCallbacks(){ 
      @Override 
      public void onConnected(@Nullable Bundle bundle) { 
       // i want app.mGoogleApiClient ConnectionCallbacks listen to this code 
      } 

      @Override 
      public void onConnectionSuspended(int i) { 
       // i want app.mGoogleApiClient ConnectionCallbacks listen to this code 
      } 
     }); 
     googleApiClientUtility.connect(); 
    } 
} 

とGoogleApiClientUtilityクラスでは:

public class GoogleApiClientUtility { 

    private MyApp mApp; 

    public GoogleApiClientUtility(MyApp app, GoogleApiClient.ConnectionCallbacks callbacks){ 
     mApp = app; 
    } 

    public final void connect() { 
     /* how to do this below??? 
     * mApp.getGoogleApiClient().registerConnectionCallbacks(????) 
     * so it can send to onConnect listener in MyActivity Class above 
     */ 
     mApp.getGoogleApiClient().connect(); 
    } 
} 

がありますコールバック関数を '呼び出し元クラス'に設定する方法はありますか?

はい、あなたがそれを行うことができ、

+0

はいそれは可能です –

+0

GoogleApiClient用のユーティリティクラスを作成し、複数のクラスにコールバックを送信します。 – ADM

答えて

0

を尋ねてください: ユーティリティクラスを作成します。

と私の主な活動クラス:

// private MyApp app; <-- declared within main activity class 
GoogleApiClientUtility googleApiClientUtility = new GoogleApiClientUtility(
        app.getGoogleApiClient(), 
        new GoogleApiClient.ConnectionCallbacks() { 
         @Override 
         public void onConnected(@Nullable Bundle bundle) { 
          Log.e("GoogleApiClient: %s", "onConnected"); 
         } 

         @Override 
         public void onConnectionSuspended(int i) { 
          Log.e("GoogleApiClient: %s", "onConnectionSuspended"); 
         } 
        } 
      ); 
      googleApiClientUtility.connect(); 
1

をありがとう、

  1. は、インタフェースクラスを記述します。

は、あなたのアイデアを得る願って、あなたが(それに応じて成功またはfalseの場合に)渡された参照を経由して、コンストラクタ

  • コール・インタフェース・メソッドでそのインタフェースの参照を渡すバック
  • 呼び出したいインターフェースを実装。さらに、自分のプロジェクトで実装した参照用のコードを追加しています。

    private void startScan() { 
        BarcodeReaderUtility barcodeReaderUtility = new BarcodeReaderUtility(mContext, new BarcodeReaderUtility.BarcodeTextProvider() { 
         @Override 
         public void onReadingSuccessfully(String barcode) { 
          etBarcode.setText(barcode); 
          etBarcode.setSelection(barcode.length()); 
         } 
        }); 
        barcodeReaderUtility.getBarCode(); 
    } 
    

    以下は、コンストラクタ経由で渡されたインターフェイスと参照を持つクラスです。何か問題が見つかった場合は、それを見てください。私は以下のようにそれを修正、@Abdul Waheed(1)からの手掛かりと

    を パブリッククラスBarcodeReaderUtility {

    private BarcodeTextProvider mBarcodeProvider; 
    private Context mContext; 
    
    public BarcodeReaderUtility(Context context, BarcodeTextProvider barcodeTextProvider) { 
        mContext = context; 
        mBarcodeProvider = barcodeTextProvider; 
    } 
    
    public final void getBarCode() { 
        final MaterialBarcodeScanner materialBarcodeScanner = new MaterialBarcodeScannerBuilder() 
          .withActivity((Activity) mContext) 
          .withEnableAutoFocus(true) 
          .withBleepEnabled(true) 
          .withBackfacingCamera() 
          .withCenterTracker() 
          .withText(mContext.getResources().getString(R.string.scanning)) 
          .withResultListener(new MaterialBarcodeScanner.OnResultListener() { 
           @Override 
           public void onResult(Barcode barcode) { 
            String barCodeResult = barcode.rawValue; 
            mBarcodeProvider.onReadingSuccessfully(barCodeResult); 
           } 
          }) 
          .build(); 
        materialBarcodeScanner.startScan(); 
    } 
    
    public interface BarcodeTextProvider { 
        void onReadingSuccessfully(String barcode); 
    } 
    

    }

  • +0

    あなたのコードと私の違いは次のとおりです: 'public final void getBarCode' materialBarcodeScannerは初期化/定義されていますが、コードでは' mGoogleApiClient'が 'context'で定義されています。 - あなたのために私の質問を編集しようとしましょう – AnD

    関連する問題