- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一次尝试 RoboGuice。到目前为止,注入(inject) View 的一切都运行顺利。
自从我在 tutorial 中看到我可以注入(inject)资源我试图添加一个 AnimatorSet
和一个获取错误:
Reason: java.lang.NullPointerException: Can't inject null value into class myroboguice.teo.ram.css.myroboguicetest.MainActivity.animatorSet when field is not @Nullable
我的代码是:
public class MainActivity extends RoboActivity {
@InjectView(R.id.textId) TextView textView1;
@InjectView(R.id.buttonId) Button button1;
@InjectView(R.id.buttonId2) Button button2;
@InjectResource(R.animator.button_anim)AnimatorSet animatorSet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView1.setText("Animator Set");
button1.setBackgroundColor(Color.YELLOW);
}
public void firstButton(View v) {
Toast toast = Toast.makeText(this, "This is a Toast", Toast.LENGTH_SHORT);
toast.show();
}
public void secondButton(View v) {
animatorSet = new AnimatorSet();
animatorSet.setTarget(button2);
animatorSet.start();
}
}
LogCat:
1) Error injecting myroboguice.teo.ram.css.myroboguicetest.MainActivity using roboguice.inject.ResourceListener$ResourceMembersInjector@41694450.
Reason: java.lang.NullPointerException: Can't inject null value into class myroboguice.teo.ram.css.myroboguicetest.MainActivity.animatorSet when field is not @Nullable
while locating myroboguice.teo.ram.css.myroboguicetest.MainActivity
1 error
at com.google.inject.internal.Errors.throwProvisionExceptionIfErrorsExist(Errors.java:451)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:65)
at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:944)
at roboguice.inject.ContextScopedRoboInjector.injectMembersWithoutViews(ContextScopedRoboInjector.java:243)
at roboguice.activity.RoboActivity.onCreate(RoboActivity.java:78)
at myroboguice.teo.ram.css.myroboguicetest.MainActivity.onCreate(MainActivity.java:26)
at android.app.Activity.performCreate(Activity.java)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)
... 12 more
Caused by: java.lang.NullPointerException: Can't inject null value into class myroboguice.teo.ram.css.myroboguicetest.MainActivity.animatorSet when field is not @Nullable
at roboguice.inject.ResourceListener$ResourceMembersInjector.injectMembers(ResourceListener.java:118)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:120)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60)
... 18 more
最佳答案
我找到了Roboguice的TypeListener的源码here ,查看178行的代码,发现异常:
if (view == null && Nullable.notNullable(field))
throw new NullPointerException(String.format("Can't inject null value into %s.%s when field is not @Nullable", field.getDeclaringClass(), field.getName()));
关于Nullable的定义类:
public class Nullable {
private Nullable() {
}
public static boolean notNullable( Field field ) {
return !isNullable( field );
}
public static boolean isNullable(Field field) {
for( Annotation a : field.getAnnotations() )
if( Strings.equals("Nullable",a.annotationType().getSimpleName()))
return true;
return false;
}
}
只需注释您的字段
@javax.annotation.Nullable
注释和异常消失。
无论如何,animator 变量将保持为空,因为 Animator 资源未加载到 Roboguice 的 injectMembers 方法中:
public void injectMembers(T instance) {
Object value = null;
try {
final Resources resources = application.getResources();
final int id = getId(resources,annotation);
final Class<?> t = field.getType();
if (String.class.isAssignableFrom(t)) {
value = resources.getString(id);
} else if (boolean.class.isAssignableFrom(t) || Boolean.class.isAssignableFrom(t)) {
value = resources.getBoolean(id);
} else if (ColorStateList.class.isAssignableFrom(t) ) {
value = resources.getColorStateList(id);
} else if (int.class.isAssignableFrom(t) || Integer.class.isAssignableFrom(t)) {
value = resources.getInteger(id);
} else if (Drawable.class.isAssignableFrom(t)) {
value = resources.getDrawable(id);
} else if (String[].class.isAssignableFrom(t)) {
value = resources.getStringArray(id);
} else if (int[].class.isAssignableFrom(t) || Integer[].class.isAssignableFrom(t)) {
value = resources.getIntArray(id);
} else if (Animation.class.isAssignableFrom(t)) {
value = AnimationUtils.loadAnimation(application, id);
} else if (Movie.class.isAssignableFrom(t) ) {
value = resources.getMovie(id);
}
if (value == null && Nullable.notNullable(field) ) {
throw new NullPointerException(String.format("Can't inject null value into %s.%s when field is not @Nullable", field.getDeclaringClass(), field
.getName()));
}
field.setAccessible(true);
field.set(instance, value);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (IllegalArgumentException f) {
throw new IllegalArgumentException(String.format("Can't assign %s value %s to %s field %s", value != null ? value.getClass() : "(null)", value,
field.getType(), field.getName()));
}
}
在 Roboguice 上的 ResourceListener 类上。
我真的不知道为什么,因为只是添加另一个条件:
else if (Animator.class.isAssignableFrom(t)) {
value = //read animator from resources
}
无法使用 Roboguice 并不是世界末日。您可以按照指示加载动画器 documentation .
修改代码:
public void secondButton(View v) {
animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.anim.button_anim);
animatorSet .setTarget(button2);
animatorSet .start();
}
关于android - RoboGuice 注入(inject) AnimatorSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25493996/
我创建了一个依赖于 ContentResolver 的类: public class MyClass { // these Injects won't work @Inject
这是我的 build.gradle 文件: buildscript { repositories { jcenter() } dependencies {
我正在尝试使用 android-quickstart 原型(prototype)创建一个 Android 基础项目,并添加 RoboGuice、ActionBarSherlock 依赖项以及 Robo
当我启动我的 RoboGuice android 应用程序时,以下消息出现在日志中: roboguice.RoboGuice﹕ Using full reflection. Try using Rob
这并不总是可见,但在特定的 API 14 和 19 上可见。 下面是堆栈跟踪 java.lang.NoClassDefFoundError: roboguice.inject.ContextScope
刚接触 roboguice,我喜欢它! 我有很多方法依赖于 DB 和 LocationManger 等,因此当我测试它们时,它使用真实的对象,我想模拟这些对象,这样当我测试时我就不必依赖在任何事情上。
我一直在查看 RoboGuice 2 的 astroboy 示例代码和文档,我真的很难过。我希望你们都可以帮助我尝试一些事情。这里的目标是测试模块以确保它正在加载并且 IoC 正在工作/连接。 我有一
这很奇怪。我在最近的所有具有相同库的项目中都使用了 Roboguice 2.0,一切似乎都很好。我开始了全新的项目,但在我的应用程序启动时,(...) 出现了一些令人毛骨悚然的错误。我到处搜索,从 S
我使用 Roboguice 1.1.2 和 guice-no-aop 2.0。我尝试使用辅助注入(inject),这需要 @Assisted 注释。我的问题是 guice-2.0-no_aop.jar
最近我下载了 Roboguice 并尝试了一下。总的来说我喜欢它,我认为它可以简化 Android 开发过程中的某些方面,但我遇到了一个尚未找到解决方案的情况:我想注入(inject)一个类,但该类有
我刚刚开始使用适用于 Android 的 Roboguice。尝试实现 this简单的上下文注入(inject)但出现此异常。我用谷歌搜索并遇到了很多帖子,但没有解决我的问题。这是下面的异常(exce
如何在自定义模块中获取应用程序上下文?这是我的模块的代码: public class MyModule extends AbstractModule { @Override @Supp
我正在使用 RoboGuice Providers 来注入(inject)自定义依赖项。我有两个提供商,第一个提供 Facebook AccessToken,第二个提供一个需要访问 token 的 F
我使用 Gradle 添加依赖项 org.roboguice:roboguice:3.0b-experimental到我的项目。 我找到了一个 post on the issue tracker ,说
我刚开始使用 Roboguice (+Guice),我不确定如何使用它的最佳实践。 在我的 Activity 中,我有大约 5 个函数(大约 30 个函数)使用一个名为“ProviderQueries
我正在尝试将 RoboGuice 作为依赖项安装到我的 Android Studio 项目中。一旦我尝试运行该项目(甚至在我添加任何新代码之前),我就会崩溃并显示以下输出: 信息:Gradle 任务
我在应用程序中打开了 proguard 我在应用程序 onCreate 中有一个警告 RoboGuice.injectMembers(_appContext, this); 异常: nalizable
我正在尝试在我的 Android 应用程序中使用 @InjectViews 但这似乎不起作用。这是它的代码。我已将库和 jar 包含到我的 android 应用程序中,并直接从 RoboActivit
我正在探索 RoboGuice 的世界,并且更改了一个 map Activity ,现在可以使用它了。它是一个 RoboMapActivity,我已经将应用程序的扩展名更改为从 RoboActivit
我第一次在项目中使用 RoboGuice,我试图注入(inject)一个静态变量,但该变量仍为空。这是我正在测试的东西的快速模型: public class MyActivity extends Ro
我是一名优秀的程序员,十分优秀!