Я использовал класс TouchInterceptor в приложении Google Music в своем приложении. Этот класс позволяет перетаскивать элементы списка в разные позиции в списке.
Класс TouchInterceptor выполняет вызов метода с именем smoothScrollBy. Этот метод доступен только в API 8 +.
Я хочу нацелить свое приложение на API 7+, поэтому мне нужно использовать отражение для выполнения smoothScrollBy, только если оно существует.
В конструкторе для TouchInterceptor я добавил следующее:
Method[] ms = this.getClass().getDeclaredMethods();
if (ms != null) {
for (Method m : ms) {
if (m != null && m.toGenericString().equals("smoothScrollBy")) {
Class[] parameters = m.getParameterTypes();
if (parameters != null && parameters.length == 1 && parameters[0].getName().equals("int")) {
mSmoothScrollBy = m;
}
}
}
}
Это должно найти метод smoothScrollBy и назначить его новой переменной-члену TouchInterceptor с именем mSmoothScrollBy (Method).
Я выполняю отладку на эмуляторе Android 2.2 (API 8), и, к сожалению, метод так и не найден. Я предполагаю, что getDeclaredMethods () не возвращает его в массиве, потому что smoothScrollBy - это метод AbsListView, который наследуется ListView и, в конечном счете, TouchInterceptor.
Я пытался привести это к AbsListView перед вызовом getClass (). GetDeclaredMethods (), но безуспешно.
Как я могу правильно получить smoothScrollBy, чтобы я мог вызвать его, когда доступно?
Обновление:
Я также пробовал следующее безрезультатно:
Method test = null;
try {
test = this.getClass().getMethod("smoothScrollBy", new Class[] { Integer.class });
}
catch (NoSuchMethodException e) {
}