我正在构建一个包含ProgressBar的Widget。如果Widget正在计算,我将ProgressBar的可见性设置为VISIBLE
,如果所有计算都停止,则设置为INVISIBILE
。应该没有问题,因为setVisibility
被记录为RemotableViewMethod
。然而,HTC的一些人似乎忘了它(即在Wildfire S上),所以拨打RemoteViews.setVisibility
会导致崩溃。因此,如果setVisibility
真的可以调用,我会尝试执行检查。我已经为它写了这个方法:
private boolean canShowProgress(){
LogCat.d(TAG, "canShowProgress");
Class<ProgressBar> barclz = ProgressBar.class;
try {
Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
Annotation[] anot = method.getDeclaredAnnotations();
return anot.length > 0;
} catch (SecurityException e) {
LogCat.stackTrace(TAG, e);
} catch (NoSuchMethodException e) {
LogCat.stackTrace(TAG, e);
}
return false;
}
这样可行,但真的丑陋,因为如果 ANY Annotiation存在,它将返回“True”。我看了一下,RemoteView本身是如何进行查找的,并发现了这个:
if (!method.isAnnotationPresent(RemotableViewMethod.class)) {
throw new ActionException("view: " + klass.getName()
+ " can't use method with RemoteViews: "
+ this.methodName + "(" + param.getName() + ")");
}
但是我不能这样做,因为通过sdk无法接受类RemotableViewMethod
。如何知道它是否可访问?
答案 0 :(得分:3)
通过编写我的问题,我有想法通过其名称查找该类,并且它有效。 所以我将我的方法更新为以下内容:
private boolean canShowProgress(){
LogCat.d(TAG, "canShowProgress");
Class<ProgressBar> barclz = ProgressBar.class;
try {
Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
Class c = null;
try {
c = Class.forName("android.view.RemotableViewMethod");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (this.showProgress= (c != null && method.isAnnotationPresent(c)));
} catch (SecurityException e) {
LogCat.stackTrace(TAG, e);
} catch (NoSuchMethodException e) {
LogCat.stackTrace(TAG, e);
}
return false;
}
完美无瑕地运作