这里我正在创建一个自定义注释来使用资源ID绑定view
。这个注释在模拟器中运行良好,但在真实设备中不起作用。
Bind.class
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface Bind {
}
Binder.class
public class Binder {
@SuppressWarnings("TryWithIdenticalCatches")
public static void bind(AppCompatActivity activity) {
for(Field field : activity.getClass().getDeclaredFields()) {
field.setAccessible(true);
Bind annotation = field.getAnnotation(Bind.class);
if (annotation != null) {
try {
Field id = R.id.class.getDeclaredField(field.getName());
field.set(activity, activity.findViewById(id.getInt(id)));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
SampleActivity.class
public class SampleActivity extends AppCompatActivity {
@Bind private Toolbar toolbar;
@Bind private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Binder.bind(this);
setSupportActionBar(toolbar);
btnLogin.setText("LOGIN");
}
}
当我在设备中运行时,binder无法初始化字段并抛出NullPointerException
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{in.company.timesheet/in.company.timesheet.SampleActivity}: java.lang.NullPointerException
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:156)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5330)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime: Caused by: java.lang.NullPointerException
E/AndroidRuntime: at in.company.timesheet.SampleActivity.onCreate(SampleActivity.java:20)
E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5135)
E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2273)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:156)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5330)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
知道我错过了什么吗?