我正在编写一个启用了ActionBar的Android应用。在我的情况下,我使用ActionBarSherlock来提供兼容性,但我认为在这种情况下并不重要。
我的Activity中ActionBar左侧显示一个Up按钮。它在调用setHomeAsUpEnabled(true);
后出现,并且会导致HomeActivity。
我想编写一个测试用例,检查Up按钮是否会导致HomeActivity。
我正在使用Robotium在UI端编写测试,所以我可以通过跟踪断言solo.assertCurrentActivity(HomeActivity.class);
来检查当前Activity的类
但我还没有找到一种方法来调用按钮上的按键。
我已尝试过solo.clickOnView(solo.getView(android.R.id.home))
和getInstrumentation().invokeMenuActionSync(solo.getCurrentActivity(), android.R.id.home, 0);
,但这些都无效。
任何帮助都将不胜感激。
答案 0 :(得分:4)
我自己找到了一个解决方法,所以在这里张贴以防任何人需要这个。 这段代码对我有用:
public static void clickOnUpActionBarButton(Activity activity) {
ActionMenuItem logoNavItem = new ActionMenuItem(activity, 0, android.R.id.home, 0, 0, "");
ActionBarSherlockCompat absc = (ActionBarSherlockCompat) UiTestUtils.invokePrivateMethodWithoutParameters(
SherlockFragmentActivity.class, "getSherlock", activity);
absc.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, logoNavItem);
}
首先,您需要通过调用SherlockFragmentActivity上的getSherlock()
来获取ActionBarSherlockCompat对象。这个方法受到保护,所以我使用Reflection API来调用它:
public static Object invokePrivateMethodWithoutParameters(Class<?> clazz, String methodName, Object receiver) {
Method method = null;
try {
method = clazz.getDeclaredMethod(methodName, (Class<?>[]) null);
} catch (NoSuchMethodException e) {
Log.e(TAG, e.getClass().getName() + ": " + methodName);
}
if (method != null) {
method.setAccessible(true);
try {
return method.invoke(receiver, (Object[]) null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return null;
}
您需要将solo.getCurrentActivity()
传递给我的clickOnUpActionBarButton(Activity activity)
方法,然后按下向上按钮。
答案 1 :(得分:4)
您的方法对我来说非常有用,但遗憾的是不适用于最新的sdk 版本!我收到错误,因为ActionBarSherlockNative无法转换为ActionBarSherlockCompat。
所以我做了以下简单的解决方法,适用于任何设备:
public static void clickOnUpActionBarButton(Solo solo) {
if (Build.VERSION.SDK_INT < 15) {
Activity activity = solo.getCurrentActivity();
ActionMenuItem logoNavItem = new ActionMenuItem(activity, 0, android.R.id.home, 0, 0, "");
ActionBarSherlockCompat absc = (ActionBarSherlockCompat) UiTestUtils.invokePrivateMethodWithoutParameters(
SherlockFragmentActivity.class, "getSherlock", activity);
absc.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, logoNavItem);
} else { // Working on latest sdk versions (above 4.0)
solo.clickOnActionBarHomeButton();
}
}
使用Android 4.2.1(API 17)在Galaxy Nexus上进行测试