2

ProgressBarを含むウィジェットを作成しています。ウィジェットがコンピューティングを行っている場合は、その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 に答える