16

Spinnerを拡張するカスタムViewクラスがあります。ユーザーが選択したときに、アクティビティが埋め込まれているアクティビティと話す正しい方法を理解しようとしています。リスナーがアダプタへの参照を取得していることはわかりますOnItemSelectedが、このアダプタを使用してその親チェーンを何らかの方法でウォークアップする必要があるのか​​、それともコンテキストに直接話しかける必要があるのか​​(何らかの理由で)がわかりません。それが失敗する可能性のある方法を私は考えられませんが、それは安全ではありません)。

4

4 に答える 4

33

それを行う正しい方法は、ビューが彼のインスタンスへの参照を保持しているインターフェースを公開することによってカスタムビューを「リッスン」することであり、ホスティングアクティビティは実装する必要があります。OnItemSelectedインターフェースとまったく同じように、Androidビューが公開しているイベントが実装されます。これがオブザーバーのデザインパターンです。

例えば:

public class MyCustomSpinner extends Spinner {
    public MyCustomSpinner(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public interface IMyEventListener {
        public void onEventOccurred();
    }

    private IMyEventListener mEventListener;

    public void setEventListener(IMyEventListener mEventListener) {
        this.mEventListener = mEventListener;
    }

    protected void someMethodWhichDoingSomthingAndShouldRaiseAlsoTheEvent() {

        /*
         * Some Code which the function doing //more code...
         */

        if (mEventListener != null) {
            mEventListener.onEventOccurred();
        }
    }
}

これはあなたがあなたの活動からそれをどのように使うかです:

            mMyCustomSpinner.setEventListener(new IMyEventListener() {

                @Override
                public void onEventOccurred() {
                    // TODO Auto-generated method stub

                }
            });
于 2012-05-27T19:59:24.113 に答える
5

ユーザーが選択したときに、アクティビティが埋め込まれているアクティビティと話す正しい方法を理解しようとしています。

「埋め込まれているアクティビティと話し合う」必要はありません。を担当するコントローラーと話したいView。今日、それはかもしれませんActivity。明日、それはかもしれませんFragment

OnItemSelectedリスナーがアダプターへの参照を取得していることはわかりますが、このアダプターを使用してその親チェーンを何らかの方法でウォークアップする必要があるかどうかがわかりません。

これは、インターフェイスにメソッドがないため、Viewが特定のタイプのを知っていることを意味します。さらに、それはあなたをと話すことに結びつけます、それは前述のように、現時点では良い計画ではありません。AdapterAdaptergetContext()Activity

個人的に、私はSpinnerそもそもカスタムサブクラスを持つことについて少し疑わしいです。しかし、それには正当な理由があると仮定して、Tal Kanelのアドバイス(私がこれを書いている間に投稿した)に従い、カスタムによって宣言されているこのカスタムイベントのカスタムリスナーインターフェイスを設計する必要がありますView。コントローラ(Activityまたは)にそのインターフェイスの実装を提供してもらいFragmentます。これは、コントローラに直接実装することも、匿名の内部クラスとして実装することもできます(Tal Kanelの回答のように)。View必要に応じてリスナーインターフェイス。

于 2012-05-27T20:04:25.550 に答える
1

正しい方法は、ある種のリスナーを使用することです。直接参照できると思います。コードを別のプロジェクトで再利用することはできません...

于 2012-05-27T19:53:48.930 に答える
1

簡単な解決策-

((ParentClass) context).functionToRun();

ここで、ParentClassはアクティビティのクラス名です。

于 2013-05-20T20:00:02.957 に答える