web-dev-qa-db-ja.com

Android-iPhone SDK Delegate Callbacksに似たものはありますか?

IPhoneからAndroidに切り替えて、iPhone SDKのどこに似たものを探していますか。クラスが特定のタスクを完了すると、デリゲートとして設定されたオブジェクトのデリゲートメソッドを呼び出します。

あまり詳細は必要ありません。ドキュメントを調べても何も見つかりませんでした(最も近いのは、iOS通知のように見える「ブロードキャストインテント」でした)。

誰かが私に正しいドキュメントを教えてもらえたとしても、それは素晴らしいことです。

ありがとう!

24
Sid

気にしないでください...ここで答えを見つけました:)

http://www.javaworld.com/javaworld/javatips/jw-javatip10.html


記事を保存するために記事から貼り付ける:

MS-WindowsおよびXWindow Systemのイベント駆動型プログラミングモデルに精通している開発者は、何かが発生したときに呼び出される(つまり、「コールバック」される)関数ポインタを渡すことに慣れています。 Javaのオブジェクト指向モデルは現在、メソッドポインターをサポートしていないため、この快適なメカニズムを使用できないようです。しかし、すべてが失われるわけではありません!

Javaのインターフェースのサポートは、コールバックと同等のものを取得できるメカニズムを提供します。秘訣は、呼び出したいメソッドを宣言する単純なインターフェースを定義することです。

たとえば、イベントが発生したときに通知を受け取りたいとします。インターフェイスを定義できます。

public interface InterestingEvent
{
    // This is just a regular method so it can return something or
    // take arguments if you like.
    public void interestingEvent ();
}

これにより、インターフェイスを実装するクラスのオブジェクトを把握できます。したがって、他の無関係な型情報を気にする必要はありません。これは、MotifでC++コードを使用するときに、ウィジェットのデータフィールドを使用してオブジェクトポインターを保持するトランポリンC関数をハッキングするよりもはるかに優れています。

イベントを通知するクラスは、InterestingEventインターフェイスを実装するオブジェクトを予期してから、interestingEvent()を呼び出す必要があります。 必要に応じてメソッド。

public class EventNotifier
{
    private InterestingEvent ie;
    private boolean somethingHappened; 
    public EventNotifier (InterestingEvent event)
    {
    // Save the event object for later use.
    ie = event; 
    // Nothing to report yet.
    somethingHappened = false;
    } 
    //...  
    public void doWork ()
    {
    // Check the predicate, which is set elsewhere.
    if (somethingHappened)
        {
        // Signal the even by invoking the interface's method.
        ie.interestingEvent ();
        }
    //...
    } 
    // ...
}

その例では、somethingHappened述語を使用して、イベントをトリガーする必要があるかどうかを追跡しました。多くの場合、メソッドが呼び出されたという事実は、interestingEvent()のシグナリングを保証するのに十分です。

イベント通知の受信を希望するコードは、InterestingEventインターフェイスを実装し、それ自体への参照をイベント通知機能に渡す必要があります。

public class CallMe implements InterestingEvent
{
    private EventNotifier en; 
    public CallMe ()
    {
    // Create the event notifier and pass ourself to it.
    en = new EventNotifier (this);
    } 
    // Define the actual handler for the event.
    public void interestingEvent ()
    {
    // Wow!  Something really interesting must have occurred!
    // Do something...
    } 
    //...
}

これですべてです。この単純なJavaイディオムを使用すると、Javaへの移行が少し不安定になることを願っています。

16
Sid

コトリンのペンダント。

インターフェイスを定義します。私の例では、外部ライブラリを使用してクレジットカードをスキャンします。

_interface ScanIOInterface {
     fun onScannedCreditCard(creditCard: CreditCard)
}
_

Activity/Fragmentを登録できるクラスを作成します。

_class ScanIOScanner {
  var scannerInterface: ScanIOInterface? = null

  fun startScanningCreditCard() {
      val creditCard = Library.whichScanCreditCard() //returns CreditCard model
      scannerInterface?.onScannedCreditCard(creditCard)
  }
}
_

Activity/Fragmentにインターフェースを実装します。

_class YourClassActivity extends AppCompatActivity, ScanIOInterface {
    //called when credit card was scanned
    override fun onScannedCreditCard(creditCard: CreditCard) {
        //do stuff with the credit card information
    }

    //call scanIOScanner to register your interface
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       super.onViewCreated(view, savedInstanceState)

       val scanIOScanner = ScanIOScanner()
       scanIOScanner.scannerInterface = this
    }
} 
_

CreditCardはモデルであり、好きなように定義できます。私の場合、ブランド、数字、有効期限が含まれています...

その後、どこでもscanIOScanner.startScanningCreditCard()を呼び出すことができます。

5
kuzdu

このビデオチュートリアル の主な内容は、インターフェイスを使用して、さまざまなフラグメントやアクティビティ間でメソッド/データ交換を委任する方法を示すことですが、Java forAndroid。

enter image description here

5
Khulja Sim Sim

Javaコールバックは、iOSデリゲートと同じものではありません。iOSでは、Androidとほぼ同じ方法でコールバックを使用できます。 Androidには、iOSデリゲートが使用されているタスクの実装に役立つstartActivityForResultがあります。

1
pvllnspk

ListAdapterはAndroidの委任パターンの例だと思います。

1
David Liu