Skip to content

Instantly share code, notes, and snippets.

@NikolaDespotoski
Last active December 21, 2015 15:58
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NikolaDespotoski/6329946 to your computer and use it in GitHub Desktop.
Save NikolaDespotoski/6329946 to your computer and use it in GitHub Desktop.
Obtain the View reference of the overflow button in the ActionBar, using java reflection.
// Path to overflow button in nutshell: android.R.id.home -> ActionBarView -> AbsActionBarView -> ActionMenuPresenter -> mOverflowButton
public static View getOverflowButton(Activity a){
View homeButton = a.findViewById(android.R.id.home);
ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources
try{
parentOfHome = parentOfHome.getParent();//get to ActionBarView;
Class absActionBarView = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class
Field menuPresenter = absActionBarView.getDeclaredField("mActionMenuPresenter"); // ActionMenuPresenter is the object that calls openOverflowMenu() closeOverflowMenu()
menuPresenter.setAccessible(true); // and contains the overflow button view.
Object menuPresenterView = menuPresenter.get(parentOfHome);
Field overflowField = menuPresenterView.getClass().getDeclaredField("mOverflowButton");
overflowField.setAccessible(true);
View overFlowButtonView = (View) overflowField.get(menuPresenterView);
return overFlowButtonView;
}
catch(NoSuchFieldException e){
Log.e("getOverflowButton()", e.getMessage());
} catch (IllegalArgumentException e) {
Log.e("getOverflowButton()", e.getMessage());
} catch (IllegalAccessException e) {
Log.e("getOverflowButton()", e.getMessage());
}
return null;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment