4

我需要知道是否已将 OnTouchListener 设置为视图。以下代码在 api 级别 15 以下工作正常。

    public static boolean isSetOnTouchListener_v8(View v) {
        try {

            Class<View> clazz = (Class<View>) Class.forName("android.view.View");
            Field f = clazz.getDeclaredField("mOnTouchListener");
            f.setAccessible(true);
            if (f.get(v) == null)   {
                return false;
            }

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return true;
    }

现在我需要 api 级别 15 及以上的相同方法。

我尝试了以下代码,但它不起作用。有没有人有什么建议?

public static boolean isSetOnTouchListener_v15(View v) {
    try {
        Object listenerInfo = getListenerInfo(v);

        if (listenerInfo != null) {
            Class<? extends Object> clazz = listenerInfo.getClass();
            Field f = clazz.getDeclaredField("mOnTouchListener");
            f.setAccessible(true);
            if (f.get(listenerInfo) == null) return false;
        }

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    return true;
}

private static Object getListenerInfo(View v) {
    Field f = null;
    try {
        f = View.class.getDeclaredField("mListenerInfo");
        f.setAccessible(true);
        return (Object) f.get(v);
    } catch (Exception e) {
        return null;
    }
}
4

0 回答 0