2017-10-28 48 views
0

我已经显示它验证文本咖啡测试:使用espresso时,setContentView可以被android-annotations替换吗?

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())); 
    } 
} 

这个测试通过当活动有以下代码:

@EActivity 
public class InformationActivity extends AppCompatActivity { 
    @ViewById(R.id.information_view) 
    TextView informationView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_information); 

     Intent intent = getIntent(); 
     String information = intent.getStringExtra("INFORMATION"); 
     informationView.setText(information); 
    } 
} 

失败当我“移动”的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); 
    } 
} 

E RROR是:

了java.lang.RuntimeException:无法启动活动ComponentInfo {com.edu/com.edu.InformationActivity_}:显示java.lang.NullPointerException:尝试调用虚拟方法“无效android.widget.TextView .setText(java.lang.CharSequence)'在一个空对象引用

我做错了什么,或者它是与espresso/android-annotations的问题?

+1

https://github.com/androidannotations/androidannotations/issues/1009#issuecomment-43714777这个答案建议使用'@ AfterViews'注释上方法与视图配置。我没有使用android-annotations思想的经验。 –

+0

谢谢,它的工作原理。其实你的答案比我的好,所以随时发布,我会接受。 – LLL

+0

你的调查更有意义的完整答案,所以发表什么工作,并接受你自己的答案;) –

回答

1

我检查通过@EActivity(R.layout.activity_information)当Android的注释生成的代码,这是怎样的onCreate看起来像生成的类(InformationActivity_):

public void onCreate(Bundle savedInstanceState) { 
    OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_); 
    init_(savedInstanceState); 
    super.onCreate(savedInstanceState); 
    OnViewChangedNotifier.replaceNotifier(previousNotifier); 
    setContentView(R.layout.activity_information); 
} 

的问题是,它首先调用super.onCreate(如此创建自InformationActivity),我在此处理intent和TextView,然后调用setContentView,这不能像那样工作。

对此的解决方案是Be_Negative建议的,所以使用@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); 
    }  
} 
0

你的问题是,你永远不会初始化资讯查看

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 
} 
} 

所以,你首先必须初始化视图。

+0

不,它由@ViewById初始化。如果你是对的,那么测试在第一种情况下也会失败。 – LLL

相关问题