Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Android视图强制转换到具有特定方法的界面?_Java_Android - Fatal编程技术网

Java 如何将Android视图强制转换到具有特定方法的界面?

Java 如何将Android视图强制转换到具有特定方法的界面?,java,android,Java,Android,我有一组UI元素TextView、EditText,甚至自定义视图,它们都有setError(CharSequence error)方法。我正在编写一个简单的实用程序类,它可以帮助我调用setError(null),这样它就可以一次性设置它们。为此,我编写了一个实用程序类ValidationUtils,它可以初始化为 ValidationUtils validator = ValidationUtils.getInstance(); validator.put(etEmail); validat

我有一组UI元素TextView、EditText,甚至自定义视图,它们都有setError(CharSequence error)方法。我正在编写一个简单的实用程序类,它可以帮助我调用setError(null),这样它就可以一次性设置它们。为此,我编写了一个实用程序类ValidationUtils,它可以初始化为

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),并且可以通过生成的类访问视图字段的方法。