1

セットリスナーラインを細かく分割できますか?

これが私が持っているコードです:

protected void onCreate(Bundle savedInstanceState) {
   Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      

      button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
             @Override
             public boolean onPreferenceClick(Preference arg0) {
                finish();   
                return true;
             }
        });     

私はこれを次のようにしたいと思います:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      
    if(button != null) {
         button.setOnPreferenceClickListener(onPreferenceClick);
    }        
}

public boolean onPreferenceClick(Preference arg0) {
    finish();   
    return true;
}
4

4 に答える 4

2

メソッドの外部で変数を作成することもできます。

    private Preference.OnPreferenceClickListener listener = new Preference.OnPreferenceClickListener() {
         @Override
         public boolean onPreferenceClick(Preference arg0) {
            finish();   
            return true;
         }
    };

次に、それを変数として使用しますsetListener(listener)。これにより、アクティビティに同じリスナークラスの複数のインスタンスを含めることができます。

于 2012-12-21T02:15:46.183 に答える
1

上記のコードはほぼすでに機能しています。この小さな変更で上記のコードを使用します。

button.setOnPreferenceClickListener(this);

次に、クラスに必要な特定のインターフェース(この場合は)を実装させるだけですPreference.OnPreferenceClickListener

このための変数の使用に関する以下のdmonの提案に加えて、リスナーを返す関数を作成することもできます。これは、以下の例のように、同様のリスナーが必要であるがわずかな変更がある場合に非常に便利です。

private Preference.OnPreferenceClickListener getListener(int listenerId) {
    return new Preference.OnPreferenceClickListener() {
         @Override
         public boolean onPreferenceClick(Preference arg0) {
            Log.i("MyTag", "Listener " + listenerId + " invoked!");
            finish();   
            return true;
         }
    };
}
于 2012-12-21T02:12:24.843 に答える
1

他の人が述べたように、メソッド名を渡すことはできませんが、setOnPreferenceClickListenerを拡張する型の変数を作成することができますPreference.OnPreferenceClickListener元のコードでは、それが実際に行っていることです。匿名の内部クラスのオブジェクトを作成しています。

このアプローチの利点は、たとえば上記のSimonAndréForsbergの答えに勝る範囲です。つまり、クラス全体ではなく、リスナーの機能をその小さなブロックに保持します。

dmonの回答buttonのようにメソッドの外部に別の変数を作成すると、匿名内部クラスの1つの大きな利点が失われます。つまり、元のコードでは、リスナーは変数とにアクセスできますsavedInstanceState。これは、関数の外部で定義された個別の変数では不可能です。

これは、匿名の内部クラスを使用する必要があることを意味するものではありません。Oracleには、イベントリスナーの作成に関する一般情報というタイトルの優れたチュートリアルがあります。

于 2012-12-21T02:51:38.273 に答える
0

ではない正確に。set-listenerにはlistenerのインスタンスが必要なので、常に作成する必要があります。そして、リスナーインターフェイスを実装するアクティビティにとっては良い方法ではないと思います。

回避策は、 http://code.google.com/p/roboguice/などのリフレクション付きのアノテーションを使用できることです。これにより、コードがよりクリーンになる可能性がありますが、依存関係も発生します。

于 2012-12-21T02:17:20.270 に答える