2017-10-30 10 views
1

これは私が解決したいAndroid開発の一般的な問題の質問です。時には、複数のボタン/テキストビューなどがあり、すべて同じリスナーが必要です。唯一の違いは、各ボタン/ビューが異なるフィールド変数に関連付けられていることです。したがって、各UI要素のリスナーは、どのフィールド変数にアクセス/変更されるかを除いて、まったく同じコードを持ちます。匿名リスナーにフィールド変数を使用させる

これを実現する恐ろしい方法は、たくさんのコードの複製を作成し、各ボタンのリスナーのコードをコピーし、必要な変数のみを変更することですが、明らかに恐ろしい解決策です。

匿名リスナークラスを返したリスナー作成メソッドを作成しようとしましたが、匿名リスナーがそれらを使用できるように、関連フィールド変数を作成メソッドに引数として渡す方法がわかりませんでした。

どのようにしてこの問題を解決できますか?

+0

おそらく[this](https://stackoverflow.com/questions/16785922/creating-the-instance-of-abstract-class-or-anonymous-class)が役立ちます。あなたはひどい例を投稿できますか? –

+0

少なくとも2つまたは3つの例が同じリスナー_ですか?これらのリスナーの抽象化の容易さは、これらのフィールドでどのような操作を行うかによって大きく異なります。 – pirho

答えて

1

リスナーが「リスナー」メソッドで多くのコードを持ち、アクセス権があるフィールド(読み取り/書き込み)のみを変更する必要がある場合は、次のようなことができます。

まず、読み出し/書き込み可能なことを表すインターフェイス:

public interface Model<T> { 
    T getFieldValue(); 
    void setFieldValue(T value); 
} 

そして、その事を使用してリスナー:その後、

public class TheListener<T> ... { 
    private final Model<T> model; 

    public TheListener(Model<T> model) { 
     this.model = model; 
    } 

    public void onClick(...) { 
     ... 
     // read access 
     model.getFieldValue(); 
     ... 
     // write access 
     model.setFieldValue(v); 
     ... 
    } 
} 

そして、それを使用します。

new TheListener<String>(new Model<String>() { 
    public String getFieldValue() { 
     return field1; 
    } 
    public void setFieldValue(String v) { 
     field1 = v; 
    } 
}); 

new TheListener<String>(new Model<String>() { 
    public String getFieldValue() { 
     return field2; 
    } 
    public void setFieldValue(String v) { 
     field2 = v; 
    } 
}); 

とそうです。

関連する問題