2

我正在编写一个启用了 ActionBar 的 Android 应用程序。就我而言,我使用 ActionBarSherlock 来提供兼容性,但我认为在这种情况下并不重要。

我的 Activity 中的 ActionBar 左侧显示了一个向上按钮。它在调用后出现setHomeAsUpEnabled(true);并导致 HomeActivity。

我想编写一个测试用例来检查按下向上按钮是否会导致 HomeActivity。我正在使用 Robotium 在 UI 端编写测试,因此我可以通过以下断言检查当前 Activity 的类solo.assertCurrentActivity(HomeActivity.class); 但我还没有找到一种方法来调用按下向上按钮的方法。

我已经尝试过solo.clickOnView(solo.getView(android.R.id.home))getInstrumentation().invokeMenuActionSync(solo.getCurrentActivity(), android.R.id.home, 0);但它们都不起作用。

任何帮助,将不胜感激。

4

2 回答 2

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

getSherlock()首先需要通过调用SherlockFragmentActivity来获取 ActionBarSherlockCompat 对象。这个方法是受保护的,所以我使用反射 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)方法,然后将按下向上按钮。

于 2012-08-01T14:57:23.627 回答
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 上对其进行了测试

于 2013-01-15T12:35:35.007 回答