当使用浓缩咖啡时,setContentView可以被android注释取代吗?
我进行了浓缩咖啡测试,以验证文本是否显示:当使用浓缩咖啡时,setContentView可以被android注释取代吗?,android,android-espresso,android-annotations,Android,Android Espresso,Android Annotations,我进行了浓缩咖啡测试,以验证文本是否显示: public class InformationActivityTests { @Rule public ActivityTestRule<InformationActivity_> mInformationActivityTestRule = new ActivityTestRule<InformationActivity_>(InformationActivity_.class) {
public class InformationActivityTests {
@Rule
public ActivityTestRule<InformationActivity_> mInformationActivityTestRule =
new ActivityTestRule<InformationActivity_>(InformationActivity_.class) {
@Override
protected Intent getActivityIntent() {
Intent i = new Intent(getTargetContext(), InformationActivity_.class);
i.putExtra("INFORMATION", "Espresso");
return i;
}
};
@Test
public void textIsDisplayed() {
onView(withText("Espresso")).check(matches(isDisplayed()));
}
}
但将setContentView移动到@EActivity注释时失败:
@EActivity(R.layout.activity_information)
public class InformationActivity extends AppCompatActivity {
@ViewById(R.id.information_view)
TextView informationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String information = intent.getStringExtra("INFORMATION");
informationView.setText(information);
}
}
错误是:
java.lang.RuntimeException:无法启动activity ComponentInfo{com.edu/com.edu.InformationActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setTextjava.lang.CharSequence”
我是做错了什么,还是因为espresso/android注释有问题?您的问题是您从未初始化informationview
public class InformationActivity extends AppCompatActivity {
@ViewById(R.id.information_view)
TextView informationView; //<-- Null
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String information = intent.getStringExtra("INFORMATION");
informationView.setText(information); //<--STILL NULL
}
}
因此,您首先必须初始化该视图。我已经检查了使用@EActivityR.layout.activity\u信息时由android注释生成的代码,这就是onCreate在生成的类信息activity\u中的样子:
public void onCreate(Bundle savedInstanceState) {
OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
init_(savedInstanceState);
super.onCreate(savedInstanceState);
OnViewChangedNotifier.replaceNotifier(previousNotifier);
setContentView(R.layout.activity_information);
}
问题是它首先从InformationActivity调用super.onCreate so onCreate,我在InformationActivity中处理intent和TextView,然后调用setContentView,但这不能像那样工作
建议使用@AfterViews注释解决这个问题。它还简化了代码,我可以删除onCreate方法:
@EActivity(R.layout.activity_information)
public class InformationActivity extends AppCompatActivity {
@ViewById(R.id.information_view)
TextView informationView;
@AfterViews
void handleIntent() {
Intent intent = getIntent();
String information = intent.getStringExtra("INFORMATION");
informationView.setText(information);
}
}
这个答案建议在带有视图配置的方法上使用@AfterViews注释。我没有安卓注解的经验。谢谢,它很管用。事实上,你的答案比我的好,所以请随意发布,我会接受。你的调查对于一个完整的答案更有意义,所以发布有效的答案并接受你自己的答案;好的,我已经更新了我的答案,再次感谢:不,它是由@ViewById初始化的。若你们是对的,那个么在第一种情况下测试也会失败。
@EActivity(R.layout.activity_information)
public class InformationActivity extends AppCompatActivity {
@ViewById(R.id.information_view)
TextView informationView;
@AfterViews
void handleIntent() {
Intent intent = getIntent();
String information = intent.getStringExtra("INFORMATION");
informationView.setText(information);
}
}