2

我正在构建一个包含 ProgressBar 的小部件。如果 Widget 正在计算,我将 ProgressBar 的可见性设置为VISIBLEINVISIBILE如果所有计算都停止,则设置为 。应该没有问题,因为它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;
    }

这会起作用,但真的很难看,因为如果存在任何注释,它将返回“True” 。我看了看,RemoteView 本身是如何进行查找的,发现了这个:

if (!method.isAnnotationPresent(RemotableViewMethod.class)) {
                throw new ActionException("view: " + klass.getName()
                        + " can't use method with RemoteViews: "
                        + this.methodName + "(" + param.getName() + ")");
            }

但我不能这样做,因为类RemotableViewMethod不能通过 sdk 访问。如何知道它是否可以访问?

4

1 回答 1

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;
    }

完美无瑕

于 2012-09-05T11:43:03.573 回答