As we show the back button instead of the finish button (checkmark) in the context action panel on Android

I get it by default enter image description here

I want this

enter image description here

This should be fairly trivial, but I can't find anything related to Android docs.

private void setupContextualBar() { mActionModeCallback = new ActionMode.Callback() { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.my_menu , menu); mCABMenu = menu; return true; } // Called each time the action mode is shown. Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { updateContextualBar(); return true; } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int menuItemId = item.getItemId(); boolean eventConsumed = false; switch (menuItemId) { //handle cases here } if (eventConsumed) { updateContextualBar(); } return eventConsumed; } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; } }; 
+5
source share
4 answers

You can change this button image using a special theme related to your activity as follows:

 <style name="MyCustomTheme" parent="MyUsualTheme"> <item name="android:actionModeCloseDrawable">@drawable/myBackDrawable</item> </style> 

AndroidManifest.xml:

  <activity android:name="MyActivity" android:theme="@style/MyCustomTheme" ... 

I researched, but did not find a way to programmatically change action_mode_close_button (there are hacks that try to do this, but they have serious potential side effects). It seems that the only reliable / safe way to change this image is to change the theme.

+10
source

If you use the default action mode: startActionMode (...)

You can use:

 <style name="MyCustomTheme" parent="MyUsualTheme"> <item name="android:actionModeCloseDrawable">@drawable/myBackDrawable</item> </style> 

But if you use Android Support V7 Action Mode: startSupportActionMode (...)

You should use:

 <style name="MyCustomTheme" parent="MyUsualTheme"> <item name="actionModeCloseDrawable">@drawable/myBackDrawable</item> </style> 
+3
source

Try the following:

 ActionBar ab; ab = getActionBar(); ab.setHomeButtonEnabled(true); ab.setTitle("Back"); ab.setIcon(R.drawable.iconBack); 

and ovrride onOptionsItemSelected function:

 @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId() == android.R.id.home) finish(); return super.onOptionsItemSelected(item); } 

Hope this helps!

0
source

This question is a bit outdated, but I decided to give an answer because I ran into the same problem today, and setting the activity topic was not a satisfactory answer for my use case. If you need only one specific close icon for each action, it is preferable to set actionModeCloseDrawable in the theme for this action. However, if you need several closing icons for the action modes in an exercise, it becomes necessary to use reflection to change the ImageView drawing being closed:

 /** * Attempts to change the ActionMode close icon drawable using reflection. * * @param drawableResId * Resource ID of the new drawable * * @return true if the drawable was changed, false otherwise. */ private boolean setActionCloseDrawable(@Nullable final ActionMode actionMode, final int drawableResId) { if (actionMode != null) { // Change the drawable for the close ImageView to the desired icon // Unfortunately, this can only be done with reflection try { final Field wrappedObjectField = actionMode.getClass().getDeclaredField("mWrappedObject"); wrappedObjectField.setAccessible(true); final Object mWrappedObject = wrappedObjectField.get(actionMode); final Field contextViewField = mWrappedObject.getClass().getDeclaredField("mContextView"); contextViewField.setAccessible(true); final Object mContextView = contextViewField.get(mWrappedObject); final Field closeField = mContextView.getClass().getDeclaredField("mClose"); closeField.setAccessible(true); final Object mClose = closeField.get(mContextView); if (mClose instanceof ImageView) { ((ImageView) mClose).setImageDrawable(getResources().getDrawable(drawableResId)); return true; } } catch (Exception ex) { Log.e(TAG, ex.getClass().getSimpleName() + " in #setActionCloseDrawable: " + ex.getLocalizedMessage() + '\n' + Log.getStackTraceString(ex)); } } return false; } 
0
source

Source: https://habr.com/ru/post/1208865/


All Articles