所以我对这个 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/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
Ruby初学者努力简单地将这个@@people散列的值打印到控制台classPerson#haveafirst_nameandlast_nameattributewithpublicaccessorsattr_accessor:first_nameattr_accessor:last_name#haveaclassattributecalled`people`thatholdsanarrayofobjects@@people=[]#havean`initialize`methodtoinitializeeachinstancedefinitialize(first_name,last_
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:AmazonAPIlibraryforPython?我正在寻找一个AmazonAPI,它可以让我:按书名或作者查找书籍显示书籍封面获取有关每本书的信息(价格、评级、评论数、格式、页数等)Python或Ruby库都可以(我只想要最容易使用的库)。有什么建议么?我知道在SO上还有其他一些关于此的帖子,但这些API似乎很快就过时了。[几个月前我尝试了几个建议的Ruby库,但无法让它们中的任何一个工作。]
我构建了一个简单的银行应用程序,它能够执行通常的操作;充值、提现等我的Controller方法执行这些操作并拯救由帐户或其他实体引发的异常。以下是Controller代码中使用的一些方法:defopen(type,with:)account=createtype,(holders.findwith)addaccountinit_yearly_interest_foraccountboundary.renderAccountSuccessMessage.new(account)rescueItemExistError=>messageboundary.rendermessageendde