Skip to content

Commit a14d938

Browse files
committed
修复新事件注入模型在同一页面多个控件parentId和id相同时覆盖的问题
1 parent 39dbaea commit a14d938

25 files changed

+73
-67
lines changed

library/src/com/lidroid/xutils/view/ViewEventListenerManager.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.lidroid.xutils.view.annotation.event.EventBase;
2222

2323
import java.lang.annotation.Annotation;
24+
import java.lang.ref.WeakReference;
2425
import java.lang.reflect.InvocationHandler;
2526
import java.lang.reflect.Method;
2627
import java.lang.reflect.Proxy;
@@ -49,30 +50,32 @@ public static void addEventMethod(
4950
View view = finder.findViewByInfo(info);
5051
if (view != null) {
5152
EventBase eventBase = eventAnnotation.annotationType().getAnnotation(EventBase.class);
52-
Class<?> eventListenerType = eventBase.eventListenerType();
53-
String eventListenerSetter = eventBase.eventListenerSetter();
53+
Class<?> listenerType = eventBase.listenerType();
54+
String listenerSetter = eventBase.listenerSetter();
5455
String methodName = eventBase.methodName();
5556

56-
Object listener = listenerCache.get(info, eventListenerType);
57+
boolean addNewMethod = false;
58+
Object listener = listenerCache.get(info, listenerType);
5759
DynamicHandler dynamicHandler = null;
5860
if (listener != null) {
5961
dynamicHandler = (DynamicHandler) Proxy.getInvocationHandler(listener);
60-
if (handler != dynamicHandler.getHandler()) {
61-
dynamicHandler.setHandler(handler);
62+
addNewMethod = handler.equals(dynamicHandler.getHandler());
63+
if (addNewMethod) {
64+
dynamicHandler.addMethod(methodName, method);
6265
}
63-
dynamicHandler.addMethod(methodName, method);
64-
} else {
66+
}
67+
if (!addNewMethod) {
6568
dynamicHandler = new DynamicHandler(handler);
6669
dynamicHandler.addMethod(methodName, method);
6770
listener = Proxy.newProxyInstance(
68-
eventListenerType.getClassLoader(),
69-
new Class<?>[]{eventListenerType},
71+
listenerType.getClassLoader(),
72+
new Class<?>[]{listenerType},
7073
dynamicHandler);
7174

72-
listenerCache.put(info, eventListenerType, listener);
75+
listenerCache.put(info, listenerType, listener);
7376
}
7477

75-
Method setEventListenerMethod = view.getClass().getMethod(eventListenerSetter, eventListenerType);
78+
Method setEventListenerMethod = view.getClass().getMethod(listenerSetter, listenerType);
7679
setEventListenerMethod.invoke(view, listener);
7780
}
7881
} catch (Throwable e) {
@@ -81,31 +84,34 @@ public static void addEventMethod(
8184
}
8285

8386
public static class DynamicHandler implements InvocationHandler {
84-
private Object handler;
87+
private WeakReference<Object> handlerRef;
8588
private final HashMap<String, Method> methodMap = new HashMap<String, Method>(1);
8689

8790
public DynamicHandler(Object handler) {
88-
this.handler = handler;
91+
this.handlerRef = new WeakReference<Object>(handler);
8992
}
9093

9194
public void addMethod(String name, Method method) {
9295
methodMap.put(name, method);
9396
}
9497

9598
public Object getHandler() {
96-
return handler;
99+
return handlerRef.get();
97100
}
98101

99102
public void setHandler(Object handler) {
100-
this.handler = handler;
103+
this.handlerRef = new WeakReference<Object>(handler);
101104
}
102105

103106
@Override
104107
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
105-
String methodName = method.getName();
106-
method = methodMap.get(methodName);
107-
if (method != null) {
108-
return method.invoke(handler, args);
108+
Object handler = handlerRef.get();
109+
if (handler != null) {
110+
String methodName = method.getName();
111+
method = methodMap.get(methodName);
112+
if (method != null) {
113+
return method.invoke(handler, args);
114+
}
109115
}
110116
return null;
111117
}

library/src/com/lidroid/xutils/view/annotation/event/EventBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
@Target(ElementType.ANNOTATION_TYPE)
1414
@Retention(RetentionPolicy.RUNTIME)
1515
public @interface EventBase {
16-
Class<?> eventListenerType();
16+
Class<?> listenerType();
1717

18-
String eventListenerSetter();
18+
String listenerSetter();
1919

2020
String methodName();
2121
}

library/src/com/lidroid/xutils/view/annotation/event/OnChildClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = ExpandableListView.OnChildClickListener.class,
34-
eventListenerSetter = "setOnChildClickListener",
33+
listenerType = ExpandableListView.OnChildClickListener.class,
34+
listenerSetter = "setOnChildClickListener",
3535
methodName = "onChildClick")
3636
public @interface OnChildClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = View.OnClickListener.class,
34-
eventListenerSetter = "setOnClickListener",
33+
listenerType = View.OnClickListener.class,
34+
listenerSetter = "setOnClickListener",
3535
methodName = "onClick")
3636
public @interface OnClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnCompoundButtonCheckedChange.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = CompoundButton.OnCheckedChangeListener.class,
34-
eventListenerSetter = "setOnCheckedChangeListener",
33+
listenerType = CompoundButton.OnCheckedChangeListener.class,
34+
listenerSetter = "setOnCheckedChangeListener",
3535
methodName = "onCheckedChanged")
3636
public @interface OnCompoundButtonCheckedChange {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnFocusChange.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = View.OnFocusChangeListener.class,
34-
eventListenerSetter = "setOnFocusChangeListener",
33+
listenerType = View.OnFocusChangeListener.class,
34+
listenerSetter = "setOnFocusChangeListener",
3535
methodName = "onFocusChange")
3636
public @interface OnFocusChange {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnGroupClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = ExpandableListView.OnGroupClickListener.class,
34-
eventListenerSetter = "setOnGroupClickListener",
33+
listenerType = ExpandableListView.OnGroupClickListener.class,
34+
listenerSetter = "setOnGroupClickListener",
3535
methodName = "onGroupClick")
3636
public @interface OnGroupClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnGroupCollapse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = ExpandableListView.OnGroupCollapseListener.class,
34-
eventListenerSetter = "setOnGroupCollapseListener",
33+
listenerType = ExpandableListView.OnGroupCollapseListener.class,
34+
listenerSetter = "setOnGroupCollapseListener",
3535
methodName = "onGroupCollapse")
3636
public @interface OnGroupCollapse {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnGroupExpand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = ExpandableListView.OnGroupExpandListener.class,
34-
eventListenerSetter = "setOnGroupExpandListener",
33+
listenerType = ExpandableListView.OnGroupExpandListener.class,
34+
listenerSetter = "setOnGroupExpandListener",
3535
methodName = "onGroupExpand")
3636
public @interface OnGroupExpand {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnItemClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = AdapterView.OnItemClickListener.class,
34-
eventListenerSetter = "setOnItemClickListener",
33+
listenerType = AdapterView.OnItemClickListener.class,
34+
listenerSetter = "setOnItemClickListener",
3535
methodName = "onItemClick")
3636
public @interface OnItemClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnItemLongClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = AdapterView.OnItemLongClickListener.class,
34-
eventListenerSetter = "setOnItemLongClickListener",
33+
listenerType = AdapterView.OnItemLongClickListener.class,
34+
listenerSetter = "setOnItemLongClickListener",
3535
methodName = "onItemLongClick")
3636
public @interface OnItemLongClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnItemSelected.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = AdapterView.OnItemSelectedListener.class,
34-
eventListenerSetter = "setOnItemSelectedListener",
33+
listenerType = AdapterView.OnItemSelectedListener.class,
34+
listenerSetter = "setOnItemSelectedListener",
3535
methodName = "onItemSelected")
3636
public @interface OnItemSelected {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnKey.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = View.OnKeyListener.class,
34-
eventListenerSetter = "setOnKeyListener",
33+
listenerType = View.OnKeyListener.class,
34+
listenerSetter = "setOnKeyListener",
3535
methodName = "onKey")
3636
public @interface OnKey {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnLongClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = View.OnLongClickListener.class,
34-
eventListenerSetter = "setOnLongClickListener",
33+
listenerType = View.OnLongClickListener.class,
34+
listenerSetter = "setOnLongClickListener",
3535
methodName = "onLongClick")
3636
public @interface OnLongClick {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnNothingSelected.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = AdapterView.OnItemSelectedListener.class,
34-
eventListenerSetter = "setOnItemSelectedListener",
33+
listenerType = AdapterView.OnItemSelectedListener.class,
34+
listenerSetter = "setOnItemSelectedListener",
3535
methodName = "onNothingSelected")
3636
public @interface OnNothingSelected {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnPreferenceChange.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = Preference.OnPreferenceChangeListener.class,
34-
eventListenerSetter = "setOnPreferenceChangeListener",
33+
listenerType = Preference.OnPreferenceChangeListener.class,
34+
listenerSetter = "setOnPreferenceChangeListener",
3535
methodName = "onPreferenceChange")
3636
public @interface OnPreferenceChange {
3737
String[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnPreferenceClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = Preference.OnPreferenceClickListener.class,
34-
eventListenerSetter = "setOnPreferenceClickListener",
33+
listenerType = Preference.OnPreferenceClickListener.class,
34+
listenerSetter = "setOnPreferenceClickListener",
3535
methodName = "onPreferenceClick")
3636
public @interface OnPreferenceClick {
3737
String[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnProgressChanged.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = SeekBar.OnSeekBarChangeListener.class,
34-
eventListenerSetter = "setOnSeekBarChangeListener",
33+
listenerType = SeekBar.OnSeekBarChangeListener.class,
34+
listenerSetter = "setOnSeekBarChangeListener",
3535
methodName = "onProgressChanged")
3636
public @interface OnProgressChanged {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnRadioGroupCheckedChange.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = RadioGroup.OnCheckedChangeListener.class,
34-
eventListenerSetter = "setOnCheckedChangeListener",
33+
listenerType = RadioGroup.OnCheckedChangeListener.class,
34+
listenerSetter = "setOnCheckedChangeListener",
3535
methodName = "onCheckedChanged")
3636
public @interface OnRadioGroupCheckedChange {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnScroll.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
@Target(ElementType.METHOD)
1616
@Retention(RetentionPolicy.RUNTIME)
1717
@EventBase(
18-
eventListenerType = AbsListView.OnScrollListener.class,
19-
eventListenerSetter = "setOnScrollListener",
18+
listenerType = AbsListView.OnScrollListener.class,
19+
listenerSetter = "setOnScrollListener",
2020
methodName = "onScroll")
2121
public @interface OnScroll {
2222
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnScrollStateChanged.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
@Target(ElementType.METHOD)
1616
@Retention(RetentionPolicy.RUNTIME)
1717
@EventBase(
18-
eventListenerType = AbsListView.OnScrollListener.class,
19-
eventListenerSetter = "setOnScrollListener",
18+
listenerType = AbsListView.OnScrollListener.class,
19+
listenerSetter = "setOnScrollListener",
2020
methodName = "onScrollStateChanged")
2121
public @interface OnScrollStateChanged {
2222
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnStartTrackingTouch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = SeekBar.OnSeekBarChangeListener.class,
34-
eventListenerSetter = "setOnSeekBarChangeListener",
33+
listenerType = SeekBar.OnSeekBarChangeListener.class,
34+
listenerSetter = "setOnSeekBarChangeListener",
3535
methodName = "onStartTrackingTouch")
3636
public @interface OnStartTrackingTouch {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnStopTrackingTouch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = SeekBar.OnSeekBarChangeListener.class,
34-
eventListenerSetter = "setOnSeekBarChangeListener",
33+
listenerType = SeekBar.OnSeekBarChangeListener.class,
34+
listenerSetter = "setOnSeekBarChangeListener",
3535
methodName = "onStopTrackingTouch")
3636
public @interface OnStopTrackingTouch {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnTabChange.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = TabHost.OnTabChangeListener.class,
34-
eventListenerSetter = "setOnTabChangeListener",
33+
listenerType = TabHost.OnTabChangeListener.class,
34+
listenerSetter = "setOnTabChangeListener",
3535
methodName = "onTabChange")
3636
public @interface OnTabChange {
3737
int[] value();

library/src/com/lidroid/xutils/view/annotation/event/OnTouch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@Target(ElementType.METHOD)
3131
@Retention(RetentionPolicy.RUNTIME)
3232
@EventBase(
33-
eventListenerType = View.OnTouchListener.class,
34-
eventListenerSetter = "setOnTouchListener",
33+
listenerType = View.OnTouchListener.class,
34+
listenerSetter = "setOnTouchListener",
3535
methodName = "onTouch")
3636
public @interface OnTouch {
3737
int[] value();

0 commit comments

Comments
 (0)