Skip to content

Commit 2fd1812

Browse files
committed
修复finalActivity无法绑定事件的bug
1 parent 1ca697a commit 2fd1812

File tree

1 file changed

+64
-124
lines changed

1 file changed

+64
-124
lines changed

src/net/tsz/afinal/FinalActivity.java

Lines changed: 64 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -21,169 +21,109 @@
2121
import net.tsz.afinal.annotation.view.Select;
2222
import net.tsz.afinal.annotation.view.ViewInject;
2323
import android.app.Activity;
24-
import android.os.Bundle;
2524
import android.text.TextUtils;
2625
import android.view.View;
2726
import android.view.ViewGroup.LayoutParams;
2827
import android.widget.AbsListView;
2928

30-
public class FinalActivity extends Activity {
29+
public abstract class FinalActivity extends Activity {
3130

32-
protected void onCreate(Bundle savedInstanceState) {
33-
super.onCreate(savedInstanceState);
34-
}
35-
3631

3732
public void setContentView(int layoutResID) {
3833
super.setContentView(layoutResID);
39-
FinalActivity.initInjectedView(this);
34+
initView();
4035
}
4136

4237

4338
public void setContentView(View view, LayoutParams params) {
4439
super.setContentView(view, params);
45-
FinalActivity.initInjectedView(this);
40+
initView();
4641
}
4742

4843

49-
5044
public void setContentView(View view) {
5145
super.setContentView(view);
52-
FinalActivity.initInjectedView(this);
46+
initView();
5347
}
5448

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();
8951
if(fields!=null && fields.length>0){
9052
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);
10955

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));
12664

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();
12778
}
12879
}
12980
}
13081
}
13182

13283

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-
}
14384

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));
15289
}
15390
}
15491

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-
}
16592

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;
174122
}
175123
}
176124

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
186127
}
187128

188-
189129
}

0 commit comments

Comments
 (0)