2014-04-12 3 views
3

Android 앱에서 계측 테스트를 수행했으며 내 Activity의 onOptionsItemSelected() 메소드를 테스트하고 싶습니다.Instrumentation.invokeMenuActionSync()가 이전 Android 장치 (API10)에서 작동하지 않습니다.

이 안드로이드의 최신 버전에서 잘 작동하지만 오래된 것들에 호출하는 onOptionsItemSelected() 메소드를 유발하지 않는 것 (예를 들어 API10 :

는이를 위해, 나는 계측의 invokeMenuActionSync 방법을 사용).

나는 다른 방법으로 결합 시도했다 : 변화없이

if (getInstrumentation().invokeMenuActionSync(activity, R.id.menu_refresh, 0 /* flags */) || 
    getInstrumentation().invokeContextMenuAction(activity, R.id.menu_refresh, 0 /* flags */)) { 
    // verify 
} 

.

저는 AppCompat ActionBar를 사용하고 있습니다.

항상이를 호출하는 더 좋은 방법이 있나요? 아니면 이전 API 레벨에서 사용할 수 있고 두 API간에 전환 할 수있는 방법이 있습니까?

+1

은 나를 위해 심지어 마지막 APPCOMPAT 버전 22.0.1로 API22에 작동하지 않습니다. 나는 조각이나 액티비티에서'onOptionItemSelected'를 호출하지 않았습니다. 해결책을 찾았습니까? – buzeeg

답변

0

는 유일한 방법은 내가 못생긴 반사 코드 사용하여

(필요하지 않을 수있다 "초기화"부분에 약간의 필드와 클래스를, 미안 해요, 난 다른 코드를 사용)입니다 계측 클래스를 지원 메뉴를 호출 발견 invokeContextMenuAction` 잘못된 항목을 실행``invokeMenuActionSync`는 아무것도하지 않고 :
// support part 
private static Class<?> actionBarActivitySupportClass; 
private static Field mImplField; 
private static Class<?> actionBarActivityDelegateBaseClass; 
private static Field mActionModeSupportField; 
private static Class<?> actionModeSupportImplClass; 
private static Field mMenuActionModeSupportField; 
private static Class<?> menuBuilderSupportClass; 
private static Field mVisibleItemsSupportField; 
private static Field mCallbackActionModeSupportField; 
private static Class<?> callbackWrapperSupportClass; 
private static Field mWrappedSupportField; 
private static Method onMenuItemSelectedSupportmethod; 
private static Field mActionBarSupportView; 
private static Class<?> actionBarViewSupportClass; 
private static Field mOptionMenuSupportField; 
private static Method dispatchMenuItemSelected; 

static { 
    init(); 
} 

private static void init() { 
    try { 
     actionBarActivitySupportClass = Class.forName("android.support.v7.app.ActionBarActivity"); //$NON-NLS-1$ 
     mImplField = actionBarActivitySupportClass.getDeclaredField("mImpl"); //$NON-NLS-1$ 
     mImplField.setAccessible(true); 
     actionBarActivityDelegateBaseClass = Class.forName("android.support.v7.app.ActionBarActivityDelegateBase"); //$NON-NLS-1$ 
     mActionModeSupportField = actionBarActivityDelegateBaseClass.getDeclaredField("mActionMode"); //$NON-NLS-1$ 
     mActionModeSupportField.setAccessible(true); 
     actionModeSupportImplClass = Class.forName("android.support.v7.app.ActionBarImplBase$ActionModeImpl"); //$NON-NLS-1$ 
     mMenuActionModeSupportField = actionModeSupportImplClass.getDeclaredField("mMenu"); //$NON-NLS-1$ 
     mMenuActionModeSupportField.setAccessible(true); 
     menuBuilderSupportClass = Class.forName("android.support.v7.internal.view.menu.MenuBuilder"); //$NON-NLS-1$ 
     mVisibleItemsSupportField = menuBuilderSupportClass.getDeclaredField("mVisibleItems"); //$NON-NLS-1$ 
     mVisibleItemsSupportField.setAccessible(true); 
     mCallbackActionModeSupportField = actionModeSupportImplClass.getDeclaredField("mCallback"); //$NON-NLS-1$ 
     mCallbackActionModeSupportField.setAccessible(true); 
     callbackWrapperSupportClass = Class.forName("android.support.v7.app.ActionBarActivityDelegateBase$ActionModeCallbackWrapper"); //$NON-NLS-1$ 
     mWrappedSupportField = callbackWrapperSupportClass.getDeclaredField("mWrapped"); //$NON-NLS-1$ 
     mWrappedSupportField.setAccessible(true); 
     onMenuItemSelectedSupportmethod = actionModeSupportImplClass.getDeclaredMethod("onMenuItemSelected", new Class[]{menuBuilderSupportClass,MenuItem.class}); //$NON-NLS-1$ 
     onMenuItemSelectedSupportmethod.setAccessible(true); 
     mActionBarSupportView = actionBarActivityDelegateBaseClass.getDeclaredField("mActionBarView"); //$NON-NLS-1$ 
     mActionBarSupportView.setAccessible(true); 
     actionBarViewSupportClass = Class.forName("android.support.v7.internal.widget.ActionBarView"); //$NON-NLS-1$ 
     mOptionMenuSupportField = actionBarViewSupportClass.getDeclaredField("mOptionsMenu"); //$NON-NLS-1$ 
     mOptionMenuSupportField.setAccessible(true); 
     dispatchMenuItemSelected = menuBuilderSupportClass.getDeclaredMethod("dispatchMenuItemSelected", new Class[]{menuBuilderSupportClass,MenuItem.class}); //$NON-NLS-1$ 
     dispatchMenuItemSelected.setAccessible(true); 
    } catch (ClassNotFoundException e) { 
     System.out.println("support class not loaded "+e.getMessage()); //$NON-NLS-1$ 
    } catch (SecurityException e) { 
     System.out.println("support class not loaded "+e.getMessage()); //$NON-NLS-1$ 
    } catch (NoSuchFieldException e) { 
     System.out.println("support class not loaded "+e.getMessage()); //$NON-NLS-1$ 
    } catch (NoSuchMethodException e) { 
     System.out.println("support class not loaded "+e.getMessage()); //$NON-NLS-1$ 
    } 

}

public static void invokeMenu(Instrumentation instrumentation,final Activity activity,final Object item) { 
    if ((mImplField != null) && (actionBarActivitySupportClass != null) && (actionBarActivitySupportClass.isInstance(activity)) 
      && (mActionBarSupportView != null) && (mOptionMenuSupportField != null) && (dispatchMenuItemSelected != null)) { 
     activity.runInUiThread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Object actionBarActivityDelegateBase = mImplField.get(activity);     
        if (actionBarActivityDelegateBase != null) { 
         Object actionBarView = mActionBarSupportView.get(actionBarActivityDelegateBase); 
         if (actionBarView != null) { 
          Object mOptionMenu = mOptionMenuSupportField.get(actionBarView);       
          dispatchMenuItemSelected.invoke(mOptionMenu, new Object[]{mOptionMenu,item});      
         } 
        }      
       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } else { 
     // good old classic way 
     instrumentation.invokeMenuActionSync(activity, ((MenuItem)item).getItemId(), 0); 
    } 

}