0

我是 Android 的初学者,我正在使用 AndroidJUnit测试来测试我的代码。

所以,我有一个扩展的测试活动ActivityInstrumentationTestCase2<Activity>

Activity 在onCreate()方法中有它自己的布局。(主要布局)

在我的 XML 中,我有一个onClick用于调用foo()方法的按钮的属性。

回到 Activity,在 中foo(View v),我将我的内容视图设置为不同的布局。

我想测试那个布局。

我如何获得布局?

我知道主要布局,我可以做到这一点。

Activity act = getActivity();
View mainLayout = (View) act.findViewById(bla.bla.bla.R.id.main_layout);

如何获得我设置的布局foo(View v)

我已经尝试过,

fooLayout = (View) act.findViewById(bla.bla.bla.R.id.foo_layout);

act.setContentView(bla.bla.bla.R.layout.foo_layout);
fooLayout = (View) act.findViewById(bla.bla.bla.R.id.foo_layout);

我想我得到NullPointerException了第一个和android.view.ViewRootImpl$CalledFromWrongThreadException 第二个。

4

2 回答 2

1

在您的第一次尝试中,您会收到 NullPointerException,因为您正在 main_layout 中搜索您的 foo_layout。findViewById用于搜索布局中的视图,而不是查找/膨胀布局。在您的第二次尝试中,您会收到 CalledFromWrongThread 异常,因为您setContentView()从 UI 线程外部访问 UI ()。这是您在测试类中更改布局的方式:

getActivity().runOnUiThread(new Runnable() {
@Override
    public void run() {
        getActivity().setContentView(R.layout.foo_layout);
    }
});
getInstrumentation().waitForIdleSync();
// now you can access your views from your foo_layout via getActivity().findViewById(...)

我不知道您所说的“我想测试我的布局”是什么意思。您想检查您的布局是否通过单击按钮成功加载,或者您想访问新(已加载)布局的视图。在这两种情况下,您都可以执行以下操作:

public void testLayout() {
    // get your button that changes the layout of your activity. 
    // that button is in your main_layout
    final Button btChangeLayout = (Button) getActivity().findViewById(R.id.yourButtonThatChangesTheLayout);

    // perform a click in order to change the layout
    getActivity().runOnUiThread(new Runnable() {
    @Override
        public void run() {
            btChangeLayout.performClick();
        }
    });
    getInstrumentation().waitForIdleSync();

    // get a reference of a view thats in your foo_layout e.g. a Button
    Button aButtonInYourFooLayout = (Button) getActivity().findViewById(R.id.aButtonInYourFooLayout);
    // now you can do what your want with your button/view. 

    //if you just want to know wheter your layout has successfully been loaded
    //or not you can test your view if it's null
    assertNotNull(aButtonInYourFooLayout);
}
于 2012-04-07T23:04:39.473 回答
0

i'm not sure ... but i think the first problem is:

act.setContentView(bla.bla.bla.R.id.foo_layout);

change to:

act.setContentView(bla.bla.bla.R.layout.foo_layout);

because in res/layout/ you have your UI, isn't it?

于 2012-04-07T21:32:22.263 回答