从代码中调出ActionBar的向上按钮

时间:2012-07-01 20:34:04

标签: android android-actionbar actionbarsherlock android-testing

我正在编写一个启用了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);,但这些都无效。

任何帮助都将不胜感激。

2 个答案:

答案 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上进行测试