|
21 | 21 | import net.tsz.afinal.annotation.view.Select;
|
22 | 22 | import net.tsz.afinal.annotation.view.ViewInject;
|
23 | 23 | import android.app.Activity;
|
24 |
| -import android.os.Bundle; |
25 | 24 | import android.text.TextUtils;
|
26 | 25 | import android.view.View;
|
27 | 26 | import android.view.ViewGroup.LayoutParams;
|
28 | 27 | import android.widget.AbsListView;
|
29 | 28 |
|
30 |
| -public class FinalActivity extends Activity { |
| 29 | +public abstract class FinalActivity extends Activity { |
31 | 30 |
|
32 |
| - protected void onCreate(Bundle savedInstanceState) { |
33 |
| - super.onCreate(savedInstanceState); |
34 |
| - } |
35 |
| - |
36 | 31 |
|
37 | 32 | public void setContentView(int layoutResID) {
|
38 | 33 | super.setContentView(layoutResID);
|
39 |
| - FinalActivity.initInjectedView(this); |
| 34 | + initView(); |
40 | 35 | }
|
41 | 36 |
|
42 | 37 |
|
43 | 38 | public void setContentView(View view, LayoutParams params) {
|
44 | 39 | super.setContentView(view, params);
|
45 |
| - FinalActivity.initInjectedView(this); |
| 40 | + initView(); |
46 | 41 | }
|
47 | 42 |
|
48 | 43 |
|
49 |
| - |
50 | 44 | public void setContentView(View view) {
|
51 | 45 | super.setContentView(view);
|
52 |
| - FinalActivity.initInjectedView(this); |
| 46 | + initView(); |
53 | 47 | }
|
54 | 48 |
|
55 |
| - /** |
56 |
| - * 初始化Actvity中的注入属性 |
57 |
| - * 可用于与其他框架合用(如ActionBarShelock) |
58 |
| - * <p> |
59 |
| - * *必须在setContentView之后调用: |
60 |
| - * <pre> |
61 |
| - * protected void onCreate(Bundle savedInstanceState) { |
62 |
| - * super.onCreate(savedInstanceState); |
63 |
| - * setContentView(view); |
64 |
| - * FinalActivity.initInjectedView(this); |
65 |
| - * } |
66 |
| - * </pre> |
67 |
| - * @param sourceActivity |
68 |
| - */ |
69 |
| - public static void initInjectedView(Activity sourceActivity){ |
70 |
| - initInjectedView(sourceActivity,sourceActivity.getWindow().getDecorView()); |
71 |
| - } |
72 |
| - |
73 |
| - /** |
74 |
| - * 初始化指定View中的注入属性 |
75 |
| - * 可用于Fragment内使用InjectView<p> |
76 |
| - * 示例:<p> |
77 |
| - * 在onCreateView中: |
78 |
| - * <pre> |
79 |
| - * public View onCreateView(LayoutInflater inflater, ViewGroup container, |
80 |
| - * Bundle savedInstanceState) { |
81 |
| - * View viewRoot = inflater.inflate(R.layout.map_frame, container, false); |
82 |
| - * FinalActivity.initInjectedView(this,viewRoot); |
83 |
| - * } |
84 |
| - * </pre> |
85 |
| - * @param sourceView |
86 |
| - */ |
87 |
| - public static void initInjectedView(Object injectedSource,View sourceView){ |
88 |
| - Field[] fields = injectedSource.getClass().getDeclaredFields(); |
| 49 | + private void initView(){ |
| 50 | + Field[] fields = getClass().getDeclaredFields(); |
89 | 51 | if(fields!=null && fields.length>0){
|
90 | 52 | for(Field field : fields){
|
91 |
| - ViewInject viewInject = field.getAnnotation(ViewInject.class); |
92 |
| - if(viewInject!=null){ |
93 |
| - int viewId = viewInject.id(); |
94 |
| - try { |
95 |
| - field.setAccessible(true); |
96 |
| - /*当已经被赋值时,不在重复赋值,用于include,inflate情景下的viewinject组合*/ |
97 |
| - if(field.get(injectedSource)==null){ |
98 |
| - field.set(injectedSource,sourceView.findViewById(viewId)); |
99 |
| - }else{ |
100 |
| - continue; |
101 |
| - } |
102 |
| - } catch (Exception e) { |
103 |
| - e.printStackTrace(); |
104 |
| - } |
105 |
| - |
106 |
| - String clickMethod = viewInject.click(); |
107 |
| - if(!TextUtils.isEmpty(clickMethod)) |
108 |
| - setViewClickListener(injectedSource,field,clickMethod); |
| 53 | + try { |
| 54 | + field.setAccessible(true); |
109 | 55 |
|
110 |
| - String longClickMethod = viewInject.longClick(); |
111 |
| - if(!TextUtils.isEmpty(longClickMethod)) |
112 |
| - setViewLongClickListener(injectedSource,field,longClickMethod); |
113 |
| - |
114 |
| - String itemClickMethod = viewInject.itemClick(); |
115 |
| - if(!TextUtils.isEmpty(itemClickMethod)) |
116 |
| - setItemClickListener(injectedSource,field,itemClickMethod); |
117 |
| - |
118 |
| - |
119 |
| - String itemLongClickMethod = viewInject.itemLongClick(); |
120 |
| - if(!TextUtils.isEmpty(itemLongClickMethod)) |
121 |
| - setItemLongClickListener(injectedSource,field,itemLongClickMethod); |
122 |
| - |
123 |
| - Select select = viewInject.select(); |
124 |
| - if(!TextUtils.isEmpty(select.selected())) |
125 |
| - setViewSelectListener(injectedSource,field,select.selected(),select.noSelected()); |
| 56 | + if(field.get(this)!= null ) |
| 57 | + continue; |
| 58 | + |
| 59 | + ViewInject viewInject = field.getAnnotation(ViewInject.class); |
| 60 | + if(viewInject!=null){ |
| 61 | + |
| 62 | + int viewId = viewInject.id(); |
| 63 | + field.set(this,findViewById(viewId)); |
126 | 64 |
|
| 65 | + setListener(field,viewInject.click(),Method.Click); |
| 66 | + setListener(field,viewInject.longClick(),Method.LongClick); |
| 67 | + setListener(field,viewInject.itemClick(),Method.ItemClick); |
| 68 | + setListener(field,viewInject.itemLongClick(),Method.itemLongClick); |
| 69 | + |
| 70 | + Select select = viewInject.select(); |
| 71 | + if(!TextUtils.isEmpty(select.selected())){ |
| 72 | + setViewSelectListener(field,select.selected(),select.noSelected()); |
| 73 | + } |
| 74 | + |
| 75 | + } |
| 76 | + } catch (Exception e) { |
| 77 | + e.printStackTrace(); |
127 | 78 | }
|
128 | 79 | }
|
129 | 80 | }
|
130 | 81 | }
|
131 | 82 |
|
132 | 83 |
|
133 |
| - private static void setViewClickListener(Object injectedSource,Field field,String clickMethod){ |
134 |
| - try { |
135 |
| - Object obj = field.get(injectedSource); |
136 |
| - if(obj instanceof View){ |
137 |
| - ((View)obj).setOnClickListener(new EventListener(injectedSource).click(clickMethod)); |
138 |
| - } |
139 |
| - } catch (Exception e) { |
140 |
| - e.printStackTrace(); |
141 |
| - } |
142 |
| - } |
143 | 84 |
|
144 |
| - private static void setViewLongClickListener(Object injectedSource,Field field,String clickMethod){ |
145 |
| - try { |
146 |
| - Object obj = field.get(injectedSource); |
147 |
| - if(obj instanceof View){ |
148 |
| - ((View)obj).setOnLongClickListener(new EventListener(injectedSource).longClick(clickMethod)); |
149 |
| - } |
150 |
| - } catch (Exception e) { |
151 |
| - e.printStackTrace(); |
| 85 | + private void setViewSelectListener(Field field,String select,String noSelect)throws Exception{ |
| 86 | + Object obj = field.get(this); |
| 87 | + if(obj instanceof View){ |
| 88 | + ((AbsListView)obj).setOnItemSelectedListener(new EventListener(this).select(select).noSelect(noSelect)); |
152 | 89 | }
|
153 | 90 | }
|
154 | 91 |
|
155 |
| - private static void setItemClickListener(Object injectedSource,Field field,String itemClickMethod){ |
156 |
| - try { |
157 |
| - Object obj = field.get(injectedSource); |
158 |
| - if(obj instanceof AbsListView){ |
159 |
| - ((AbsListView)obj).setOnItemClickListener(new EventListener(injectedSource).itemClick(itemClickMethod)); |
160 |
| - } |
161 |
| - } catch (Exception e) { |
162 |
| - e.printStackTrace(); |
163 |
| - } |
164 |
| - } |
165 | 92 |
|
166 |
| - private static void setItemLongClickListener(Object injectedSource,Field field,String itemClickMethod){ |
167 |
| - try { |
168 |
| - Object obj = field.get(injectedSource); |
169 |
| - if(obj instanceof AbsListView){ |
170 |
| - ((AbsListView)obj).setOnItemLongClickListener(new EventListener(injectedSource).itemLongClick(itemClickMethod)); |
171 |
| - } |
172 |
| - } catch (Exception e) { |
173 |
| - e.printStackTrace(); |
| 93 | + private void setListener(Field field,String methodName,Method method)throws Exception{ |
| 94 | + if(methodName == null || methodName.trim().length() == 0) |
| 95 | + return; |
| 96 | + |
| 97 | + Object obj = field.get(this); |
| 98 | + |
| 99 | + switch (method) { |
| 100 | + case Click: |
| 101 | + if(obj instanceof View){ |
| 102 | + ((View)obj).setOnClickListener(new EventListener(this).click(methodName)); |
| 103 | + } |
| 104 | + break; |
| 105 | + case ItemClick: |
| 106 | + if(obj instanceof AbsListView){ |
| 107 | + ((AbsListView)obj).setOnItemClickListener(new EventListener(this).itemClick(methodName)); |
| 108 | + } |
| 109 | + break; |
| 110 | + case LongClick: |
| 111 | + if(obj instanceof View){ |
| 112 | + ((View)obj).setOnLongClickListener(new EventListener(this).longClick(methodName)); |
| 113 | + } |
| 114 | + break; |
| 115 | + case itemLongClick: |
| 116 | + if(obj instanceof AbsListView){ |
| 117 | + ((AbsListView)obj).setOnItemLongClickListener(new EventListener(this).itemLongClick(methodName)); |
| 118 | + } |
| 119 | + break; |
| 120 | + default: |
| 121 | + break; |
174 | 122 | }
|
175 | 123 | }
|
176 | 124 |
|
177 |
| - private static void setViewSelectListener(Object injectedSource,Field field,String select,String noSelect){ |
178 |
| - try { |
179 |
| - Object obj = field.get(injectedSource); |
180 |
| - if(obj instanceof View){ |
181 |
| - ((AbsListView)obj).setOnItemSelectedListener(new EventListener(injectedSource).select(select).noSelect(noSelect)); |
182 |
| - } |
183 |
| - } catch (Exception e) { |
184 |
| - e.printStackTrace(); |
185 |
| - } |
| 125 | + public enum Method{ |
| 126 | + Click,LongClick,ItemClick,itemLongClick |
186 | 127 | }
|
187 | 128 |
|
188 |
| - |
189 | 129 | }
|
0 commit comments