在Android Instrumentation测试中如何强制屏幕方向更改?

28
我正在使用ActivityInstrumentationTestCase2类编写一些应用程序的验收测试。 我想在测试中引起方向更改,以确保发生了许多事情,包括确保Activity状态被保留,但我还希望确保使用与方向相适应的适当布局。
我知道我可以简单地测试onSaveInstanceState / onRestoreInstanceState / onPause / onResume等方法,以确保实例状态得到保留。 但是,我想知道是否有引起方向更改事件的机制?
这是否涉及注入某种运动事件来欺骗设备/模拟器,使其认为已经旋转,或者是否由Instrumentation提供了实际方法来实现这一点?
谢谢 & 祝好!
3个回答

51

实际上,您完全不必使用Robotium。事实上,如果您查看Robotium的源代码,当您调用它时,它所做的就是

solo.setActivityOrientation(Solo.LANDSCAPE);

is

myActivity = this.getActivity(); // In your setUp method()

...

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

很棒,我已经把采纳答案改成了你的。探索工作的赞扬归功于您先生。 - plainjimbo
Robotium 对于这个似乎更简短。 - IgorGanapolsky
8
可能需要在此之后调用 getInstrumentation().waitForIdleSync(); 以等待方向更改发生,因为它是异步执行的。请注意,保持原文意思不变,同时使语言更加通俗易懂。 - Ognyan
谢谢,但是在我将其设置到设备后,如果我进行物理更改,它就会停止获取真实方向。我该如何恢复默认设置? - Idemax

5

就像 AndrewKS 所写的一样,您可以使用

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
assertTrue(...);

请求方向更改。但旋转本身是异步执行的。如果要真正测试方向更改之后的状态,需要在请求之后等待一段时间:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Thread.sleep(50); // depends on performance of the testing device/emulator
assertTrue(...);

3

使用Robotium进行操作。有一个名为Solo的类,你可以使用它来改变屏幕方向,只需调用一个方法:

solo.setActivityOrientation(Solo.LANDSCAPE);

就是这样!您的方向会被改变。 您可以搜索Robotium并获取其jar文件,并将其添加到您的测试项目中。Robotium网站还提供了一个Android记事本应用程序的示例测试项目(该应用程序可作为Android SDK的示例项目),展示了它的强大和易用性。


哇,谢谢!自我提问以来已经有一段时间了,它被浏览了很多次。这绝对解决了我的问题。Robotium看起来是一个很棒的测试库。 - plainjimbo
很遗憾,Robotium不支持片段。 - Martin
1
它现在支持碎片 :) - Dori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接