当使用浓缩咖啡时,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);
    }    
}