OnPrepareActionMode no se llama al crear ActionMode

Acabo de terminar de ajustar una de mis aplicaciones al nuevo soporte v22.1.1 y librerías appcompat, vea aquí y aquí para más detalles. Cuando hice algunas pruebas, algo estaba apagado con los ActionModes que estoy usando.

Cuando se inicia un ActionMode con una llamada startSupportActionMode() , no importa si se utiliza la clase base ActionBarActivity ahora desaprobada o la nueva clase base onPrepareActionMode()onPrepareActionMode() no se está llamando.

En versiones anteriores, incluyendo v21.0.3 y v22.0.0, onPrepareActionMode() se llamó automáticamente, cuando el ActionMode se creó inicialmente con startSupportActionMode() .

Lo probé en un dispositivo 2.2, 4.4.2 y 5.0, por lo que parece no ser dependiente de la versión.

¿Alguien sabe, si se pretende que el comportamiento, que se ha introducido en v22.1.1, o un error?

Encontré este problema , pero aquí no hay mucha información …

Editar 11 de mayo de 2015:

Como se menciona en el rastreador de incidencias de Android 159527 , este problema no sólo afecta a la v22.1.x de appcompat y la biblioteca de soporte, sino también a la implementación de Android 5.1.

Dos posibles soluciones temporales por el momento, una general:

 @Override public ActionMode startSupportActionMode(final ActionMode.Callback callback) { // Fix for bug https://code.google.com/p/android/issues/detail?id=159527 final ActionMode mode = super.startSupportActionMode(callback); if (mode != null) { mode.invalidate(); } return mode; } 

Y un 'rápido y sucio' (cuando instancia su ActionMode):

 final ActionMode actionMode = startSupportActionMode(new MyActionMode()); if(actionMode != null) { actionMode.invalidate(); } 

Si no utiliza appcompat ( ActionBarActivity / AppCompatActivity ) debe reemplazar startSupportActionMode() con startActionMode() .

Por desgracia, aún no está claro si se trata de un nuevo comportamiento o un error. Según el doc del API es un error / regresión, pero quién sabe …

He creado una demostración y su trabajo bien, onPrepareActionMode se llama cada vez que se muestra el modo de acción. Siempre llamado after onCreateActionMode, pero puede ser llamado varias veces si el modo es invalidado. [ Pido a cualquiera que haga una pequeña edición. Necesito color de barra de estado igual que la de la barra de herramientas, pero dinámicamente, se puede ver Drawyer Layout innecesario se utiliza para lograr este efecto, Pero si quito diseño drawyer el color de la barra de estado no cambia según el color de la barra de herramientas. En la utilidad se puede ver por defecto el color del tema por defecto es rojo, la barra de herramientas intially obtiene color rojo, pero la barra de estado no, sólo y sólo si quito el diseño drawyer. Tengo que hacer esto usando estilo. ] Crear una disposición de recursos y nombrarla => action_mode_activity

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:orientation="vertical" app:insetForeground="#4000"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> <EditText android:id="@+id/editTextCopy" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="19dp" android:ems="10" android:inputType="textMultiLine" android:text="Long click to share!"> <requestFocus /> </EditText> </LinearLayout> </android.support.v4.widget.DrawerLayout> 

Crear un nombre de actividad que ActionModeActivity

 import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.example.deepakpawar.demolearning.R; import com.example.deepakpawar.demolearning.demo.load.recycler.Utils; /** * Created by Deepak Pawar on 9/24/2015. */ public class ActionModeActivity extends AppCompatActivity implements View.OnLongClickListener, ActionMode.Callback { EditText editTextCopy; android.view.ActionMode mActionMode; private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils.onActivityCreateSetTheme(this); setContentView(R.layout.action_mode_activity); // 1. Get the editText editTextCopy = (EditText) findViewById(R.id.editTextCopy); // 2. add long-click listener editTextCopy.setOnLongClickListener(this); toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); actionBar.setTitle("Android Students"); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } } @Override public boolean onLongClick(View view) { // if actionmode is null "not started" if (mActionMode != null) { return false; } // Start the CAB mActionMode = this.startActionMode(this); view.setSelected(true); return true; } // 4. Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.action_menu, menu); return true; } // 5. Called when the user click share item @Override public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_share: Toast.makeText(this, "Shared!", Toast.LENGTH_SHORT).show(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } // 6. 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(android.view.ActionMode mode, Menu menu) { Toast.makeText(ActionModeActivity.this,"onPrepareActionMode Called ",Toast.LENGTH_SHORT).show(); return false; // Return false if nothing is done } // 7. Called when the user exits the action mode @Override public void onDestroyActionMode(android.view.ActionMode mode) { mActionMode = null; } } 

// Utils clase que tiene el método para cambiar el tema // lo creé porque necesito cambiar el tema de la aplicación dinámicamente importación android.app.Activity;

 public class Utils { private static int sTheme; public final static int THEME_DEFAULT = 0; public final static int THEME_WHITE = 1; public final static int THEME_BLUE = 2; /** * Set the theme of the Activity, and restart it by creating a new Activity of the same type. */ public static int getsTheme() { return sTheme; } public static void changeToTheme(Activity activity, int theme) { sTheme = theme; activity.recreate(); // activity.finish(); // activity.startActivity(new Intent(activity, activity.getClass())); } /** * Set the theme of the activity, according to the configuration. */ public static void onActivityCreateSetTheme(Activity activity) { switch (sTheme) { default: case THEME_DEFAULT: activity.setTheme(R.style.FirstTheme); break; case THEME_WHITE: activity.setTheme(R.style.SecondTheme); break; case THEME_BLUE: activity.setTheme(R.style.Thirdheme); break; } } } 

V21-themes.xml

 <resources> <style name="AppTheme" parent="AppTheme.Base"> <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> <item name="android:windowAllowReturnTransitionOverlap">true</item> <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> <item name="android:windowSharedElementExitTransition">@android:transition/move</item> <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> <!-- <item name="android:navigationBarColor">@color/PrimaryColor</item>--> <item name="windowActionBar">false</item> <item name="windowActionModeOverlay">true</item> <!-- To Make Navigation Drawer Fill Status Bar and become Transparent Too --> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <!--//if darker status bar needed--> <!-- <item name="android:windowTranslucentStatus">true</item>--> </style> <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/PrimaryColor</item> <item name="colorPrimaryDark">@color/PrimaryDarkColor</item> <item name="colorAccent">@color/AccentColor</item> <item name="android:textColorPrimary">@color/TextPrimaryColor</item> <item name="android:windowBackground">@color/WindowBackground</item> </style> <style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> <item name="android:contentDescription">@string/accessibility_overflow</item> </style> <!-- style for the tool bar backgrounds --> <style name="ToolBarStyle" parent="ToolBarStyle.Base" /> <style name="ToolBarStyle.Base" parent=""> <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item> <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item> </style> <style name="ToolBarStyle.Event" parent="ToolBarStyle"> <item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item> </style> <style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> <!--Any text styling can be done here--> <item name="android:textStyle">normal</item> <item name="android:textSize">18sp</item> <item name="android:textColor">#000000</item> </style> <!-- Customize your theme example here. --> <style name="FirstTheme"> <item name="android:textColor">#FF0000</item> <item name="colorPrimary">#FF0000</item> <item name="colorPrimaryDark">#ff0000</item> <item name="colorAccent">#ff0087</item> <item name="android:shadowColor">#00ccff</item> <item name="android:shadowRadius">1.5</item> <item name="android:shadowDy">1</item> </style> <style name="SecondTheme"> <item name="android:textColor">#00FF00</item> <item name="colorPrimary">#00FF00</item> <item name="colorPrimaryDark">#00FF00</item> <item name="colorAccent">#00FF90</item> <item name="android:shadowColor">#00ccff</item> <item name="android:shadowRadius">1.5</item> <item name="android:shadowDy">1</item> </style> <style name="Thirdheme"> <item name="android:textColor">#0000F0</item> <item name="colorPrimary">#0000F0</item> <item name="colorPrimaryDark">#0000F0</item> <item name="colorAccent">#0090F0</item> <item name="android:shadowColor">#00ccff</item> <item name="android:shadowRadius">1.5</item> <item name="android:shadowDy">1</item> </style> <style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="colorAccent">#FFCC00</item> <item name="android:textColorPrimary">#FFFFFF</item> <item name="android:background">#5fa3d0</item> </style> </resources> 
  • Android AppCompat 22.1.1 color de texto predeterminado y estilo ActionMode
  • Cómo utilizar MultiChoiceModeListener en ListVIew con y sin soporte?
  • No se puede convertir en LayerDrawable (después de actualizar v7)
  • YouTubePlayer junto con la biblioteca AppCompat v7
  • OnPrepareOptionsMenu en Fragmento no se llama como de AppCompat v22 (API 10)
  • AppCompat v22.1.0 no theming todos los widgets xml correctamente para fragmentos
  • Diferentes estilos de colorControlActivated en Android
  • Necesita utilizar un tema Theme.AppCompat (o descendiente) con esta actividad. Cambiar a Theme.AppCompat causa otro error
  • Obtener AppCompat no admite la excepción de características del tema actual después de actualizar a la versión AppCompat v22.1.0 issue
  • Android: layout_height = "? Attr / actionBarSize" no funciona con soporte: design: 23.0.0 'library
  • Android: TextView no respeta el androide: TextViewStyle usando appcompat-v7 22.1.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.