- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我对这个 Activity 有不同的布局。
我有不同的类,每个类都打开并使用布局做他们的事情。
我通过@Inject 在 Activity 中注入(inject)这些类。这一切都没有问题。
但是当我尝试在非 Activity 布局中的控件之一上使用@InjectView 时,我收到错误消息。
11-02 19:17:31.086: ERROR/AndroidRuntime(1326): Caused by: java.lang.NullPointerException: Can't inject null value into class be.baes.notes.View.EditNoteImpl.saveButton when field is not @Nullable
这就是代码。
public class EditNoteImpl implements EditNote {
@Inject CancelEditNoteClickListener cancelEditNoteClickListener;
@Inject SaveNoteClickListener saveNoteClickListener;
@Inject Provider<Activity> activity;
@InjectView(R.id.saveButton) Button saveButton;
/* (non-Javadoc)
* @see be.baes.notes.EditNote#activateEditNote()
*/
@Override
public void activateEditNote()
{
activity.get().setContentView(R.layout.editnote);
this.saveButton.setOnClickListener(saveNoteClickListener);
}
}
不过我可以这样做。
public class EditNoteImpl implements EditNote {
@Inject CancelEditNoteClickListener cancelEditNoteClickListener;
@Inject SaveNoteClickListener saveNoteClickListener;
@Inject Provider<Activity> activity;
private Button saveButton;
/* (non-Javadoc)
* @see be.baes.notes.EditNote#activateEditNote()
*/
@Override
public void activateEditNote()
{
activity.get().setContentView(R.layout.editnote);
saveButton = (Button)activity.get().findViewById(R.id.saveButton);
this.saveButton.setOnClickListener(saveNoteClickListener);
}
}
有更好的方法吗?
最佳答案
我刚刚开始使用 roboguice,所以其他有更多经验的人可能会给出更好的答案,但这是我目前的发现:
在 roboguice-1.1.2(当前稳定版本)中,@InjectView
只有在 setContentView()
时才会注入(inject)项目在 Activity 中被第一次调用。由于您的代码调用 setContentView()
动态地从辅助类中注入(inject)的项目将不会被正确注入(inject)。
在 roboguice-2.0b2(当前测试版)中,支持多个 setContentView()
电话和你的代码应该工作。然而,注入(inject)的 View 仍然绑定(bind)到上下文 Activity (而不是声明类)所以每个 @InjectView
可能还需要 @Nullable
所有辅助类共享同一个 Activity。
由于这里的问题似乎根源于单个 Activity 中的多个布局(因此有多个 setContentView()
调用),另一种方法是按照以下方式避免它:
<include/>
标记以将所有布局加载到父 FrameLayout 中:<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<include layout="@layout/layout1" />
<include layout="@layout/layout2" />
<!-- other layouts... -->
</FrameLayout>
setContentView()
,使用一种方法来切换 Activity 上的可见布局,如下所示:// instead of: activity.setContentView(R.layout.layout1);
// use: activity.showLayout(R.id.layoutview1);
public void showLayout(int layoutViewId) {
final View view = findViewById(layoutViewId);
final ViewGroup root = (ViewGroup) view.getParent();
for (int i = 0; i < root.getChildCount(); i++) {
final View v = root.getChildAt(i);
v.setVisibility(v == view ? View.VISIBLE : View.GONE);
}
}
上述替代方案应该适用于稳定版和测试版 roboguice 版本。这里的权衡是我们同时加载多个布局,而不是在几个不同的时间加载每个布局。它似乎对我来说效果很好(尽管它可能会因您的需求而有所不同)。
我应该注意的一件事是,在当前 "Upgrading from RoboGuice 1.1 to 2.0"页面,提到以下内容:
The ability to use @InjectView in Views (although you'll need to call RoboGuice.injectMembers() yourself, since there's no RoboView base class and probably never will be).
看起来这应该允许您实现从 View 派生的辅助类并生成 @InjectView
在它们中工作得更好(希望它们不需要是 @Nullable
因为它们与 Activity 的联系较少)。然而,从目前的代码来看,这个功能似乎还没有实现(虽然我可能看错了地方)。
关于android - Injectview(Roboguice)不适用于多种布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7985615/
我创建了一个依赖于 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
我是一名优秀的程序员,十分优秀!