2017-04-04 13 views
0

私はUI要素のセットTextView、EditText、さらにそれらにsetError(CharSequenceエラー)メソッドを持つカスタムビューを持っています。私はsetError(null)を呼び出すのに役立つシンプルなユーティリティクラスを作成しています。このために、私は特定のメソッドを持つインターフェイスにAndroidビューをキャストするにはどうすればよいですか?

ValidationUtils validator = ValidationUtils.getInstance(); 
validator.put(etEmail); 
validator.put(etPassword); 

...好きで、一般的なバリのputに初期化できるユーティリティクラスValidationUtilsを書いたことはViewオブジェクトになります。 AndroidビュークラスはsetError(CharSequenceエラー)を持たないようですが、EditTextなどの個々のUIクラスはそうです。私はすべてのエントリをMapの中に入れて保存し、次に validator.clearAllを呼び出してこのマップを反復し、すべてのクラスでsetErrorを呼び出してnullを設定します。私のようなインターフェース書かれています:

public interface Validatable { 
    void setError(CharSequence errorMsg); 
} 

をしかし、非常に私は私が後でSETERRORを呼び出すことができるように、このインターフェイスにキャストプット経由で追加された要素を()することで進行するであろう方法を見つけ出すことはできません。今プットを呼び出す

は、基本Viewクラスは、あなたのインターフェイスを実装しますするための方法はありませんので、あなたは、それを行うことはできません私にjava.lang.ClassCastException: android.support.v7.widget.AppCompatEditText cannot be cast to Validatable

答えて

1

を与えます。それは、フレームワーククラスのために、あなたの例の両方をカバーする必要がありますので、

if (view instanceof Validatable) { 
    Validatable.class.cast(view).setError(null); 
} else if (view instanceof TextView) { 
    TextView.class.cast(view).setError(null); 
} 

EditTextTextViewを拡張します。しかし、あなたは何ができるか、カスタムViewクラスのようなものをそのインターフェイスを実装して、間に合わです。

+0

あなたは正しいです。しかし、私はこれを回避する方法を見つけたかもしれないと思う。ライブラリ "バターナイフ"は、コンパイル時にJavaPoetを使用して既存のアクティビティクラスを拡張し、必要なインタフェース(Butterknifeの場合Unbinder)を実装し、生成されたクラスを介してビューフィールドのメソッドにアクセスできるようにすることでこれを克服しているようです。 –

関連する問題