2

ActionBarを有効にしてAndroidアプリを作成しています。私の場合、互換性を提供するためにActionBarSherlockを使用していますが、この場合は問題ではないと思います。

アクティビティのActionBarの左側に[上へ]ボタンが表示されています。を呼び出した後に表示さsetHomeAsUpEnabled(true);れ、HomeActivityにつながります。

上ボタンを押すとそのHomeActivityにつながることを確認するテストケースを作成したいと思います。Robotiumを使用してUI側でテストを記述しているので、アサーションに従って現在のアクティビティのクラスを確認でき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オブジェクトを取得する必要があります。このメソッドは保護されているため、ReflectionAPIを使用して呼び出しました。

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 に答える