2016-04-15 4 views
2

SwipeRefreshLayout использует заданную переменную для анимации окончания. В некоторых случаях использования мне нужно изменить это на 0, но я не могу понять, как это сделать. Вот переменная:SwipeRefreshLayout - изменение времени анимации

private static final int SCALE_DOWN_DURATION = 150; 

Любая помощь была бы принята с благодарностью.

+0

может быть лучше просто взять исходный код и изменить его в соответствии с вашими потребностями – ootinii

ответ

0

Вам нужно будет получить доступ к приватному полю и обновить значение до 0, используя API отражения Java. Поскольку поле является окончательным, вам нужно будет обновить его модификаторы, чтобы удалить эту информацию, как описано в this post.

Field duration = SwipeRefreshLayout.class.getDeclaredField("SCALE_DOWN_DURATION"); 
duration.setAccessible(true); // counteract private modifier 

Field mods = Field.class.getDeclaredField("modifiers"); // retrieve modifiers for the constant field 
mods.setAccessible(true); 
int finalValue = mods.getModifiers() & ~Modifier.FINAL; // flip final value, allowing mutation of the field 
mods.setInt(mods, finalValue); 
duration.setInt(hack, 0); // set value 

Это должно пойти, не говоря, но так как это деталь реализации SwipeRefreshLayout нет никакой гарантии, что это не будет ломаться без предупреждения в будущем. Если вам требуются несколько модификаций, подобных этому, то более удобное решение может оказаться разметкой класса и сохранением собственной версии.

+0

«не может решить метод" getDeclaredModifiers (java.lang.String)» – Psest328

+0

Измененное название метод getDeclaredField (java.lang.String) – fractalwrench

+1

Явы. lang.NoSuchFieldException: модификаторы полей в классе Ljava/lang/reflection/Field; (объявление/java.lang.reflect.Field появляется в /system/framework/core-libart.jar) – Psest328

Смежные вопросы