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.
- Personalización predeterminada Theme.AppCompat.Dialog.Alert con android.support.v7.app.AlertDialog
- Android: no puede resolver los temas de appcompat-v7
- Utilizar la clase DrawableCompat para aplicar una tintList
- Cuadro de diálogo de alerta de Appcompat Fondo del botón de acción En estado presionado
- La barra de herramientas no es visible en dispositivos Android 4.X
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 …
- ClassCastException: android.widget.LinearLayout $ LayoutParams no se puede convertir en com.android.internal.widget.ActionBarOverlayLayout $ LayoutParams
- Error: (3, 5) Ningún recurso encontrado que coincida con el nombre dado
- DialogFragment con AppCompatDialog se bloquea si se establece STYLE_NO_TITLE
- Quitar el botón de nuevo de SearchView en la barra de herramientas AppCompat
- Android AppCompat SearchView EditText falta línea inferior en pre-lollipop
- ¿Cómo implementar NestedScrolling en Android?
- Atributo "titleTextStyle" ya se ha definido en android studio 1.2.1?
- Inheriting AppCompat 22.1.1 El cuadro de diálogo colorAccent del tema de la aplicación no funciona
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>
- La aplicación está mal configurada para acceder a Facebook: Problema de integración con Android Facebook
- Eclipse no muestra la ventana del administrador de Avd y el proyecto android