Java 如何将Android视图强制转换到具有特定方法的界面?
我有一组UI元素TextView、EditText,甚至自定义视图,它们都有setError(CharSequence error)方法。我正在编写一个简单的实用程序类,它可以帮助我调用setError(null),这样它就可以一次性设置它们。为此,我编写了一个实用程序类ValidationUtils,它可以初始化为Java 如何将Android视图强制转换到具有特定方法的界面?,java,android,Java,Android,我有一组UI元素TextView、EditText,甚至自定义视图,它们都有setError(CharSequence error)方法。我正在编写一个简单的实用程序类,它可以帮助我调用setError(null),这样它就可以一次性设置它们。为此,我编写了一个实用程序类ValidationUtils,它可以初始化为 ValidationUtils validator = ValidationUtils.getInstance(); validator.put(etEmail); validat
ValidationUtils validator = ValidationUtils.getInstance();
validator.put(etEmail);
validator.put(etPassword);
通常,验证器的put接受一个视图对象。Android View类似乎没有setError(CharSequence错误),但个别UI类(如EditText)有。我想将put中的所有条目存储在一个映射中,然后调用一个验证器.clearAll
来迭代这个映射,并调用每个类中的setError来设置null。我编写了如下界面:
public interface Validatable {
void setError(CharSequence errorMsg);
}
但是我不太清楚如何继续通过put()将添加的元素转换到此接口,以便稍后调用setError
现在调用put给了我
java.lang.ClassCastException:android.support.v7.widget.AppCompatiEditText无法转换为Validatable
,因为您无法使基本视图
类实现您的接口。但是,您可以做的是让自定义的视图
类实现该接口,然后执行以下操作:
if (view instanceof Validatable) {
Validatable.class.cast(view).setError(null);
} else if (view instanceof TextView) {
TextView.class.cast(view).setError(null);
}
EditText
扩展了TextView
,因此这应该涵盖框架类的两种情况。你是对的。但我想我可能已经找到了解决这个问题的方法。库“butterknife”似乎克服了这一问题,它使用JavaPoet在编译时生成代码,扩展现有的activity类并实现所需的接口(butterknife使用Unbinder),并且可以通过生成的类访问视图字段的方法。