puro - miui vs android one
Dispositivos con Android+MIUI y setCustomSelectionActionModeCallback (3)
Así que descubrí una solución alternativa, pero tiene sentido solo si es absolutamente necesario que funcione en dispositivos MIUI. En general es un poco incómodo
Noté que la aplicación de Wikipedia tiene acciones personalizadas que funcionan en un dispositivo Xiaomi, y después de revisar el código descubrí que funciona bien cuando se seleccionan los textos en una vista WebView
. Básicamente, puede usar una vista WebView
y anular onActionModeStarted
en su actividad
Actividad:
String html = "<!DOCTYPE html>/n" +
"<html>/n" +
"<head>/n" +
"</head>/n" +
"<body>/n" +
"/n" +
"<h1>WebView text</h1>/n" +
"/n" +
"</body>/n" +
"</html>/n";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.web_view);
webView.setWebViewClient(new WebViewClient());
webView.loadData(html, "text/html", "UTF-8");
}
@Override
public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
Menu menu = mode.getMenu();
menu.clear();
mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
}
Menú:
<item android:id="@+id/id1"
android:title="miui"
app:showAsAction="ifRoom" />
<item android:id="@+id/id2"
android:title="has"
app:showAsAction="ifRoom" />
<item android:id="@+id/id3"
android:title="bugs"
app:showAsAction="ifRoom" />
<item android:id="@+id/id4"
android:title="D:"
app:showAsAction="ifRoom" />
Estoy intentando crear un menú de selección personalizado, pero no funciona en un dispositivo con ROM MIUI y Android 6. El resultado es un menú común con "copiar" y "seleccionar todos" los elementos. En otros dispositivos y simuladores bajo Android limpio, funciona bien. El código
textViewTop.setCustomSelectionActionModeCallback(new android.view.ActionMode.Callback() {
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
Log.d(LOG_TAG, "onCreateActionMode");
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Log.d(LOG_TAG, "onPrepareActionMode");
menu.clear();
int quote_quick = R.drawable.ic_desktop_mac_black_24dp;
int quote_add = R.drawable.ic_computer_black_24dp;
int copy = R.drawable.ic_devices_other_black_24dp;
menu.add(Menu.NONE, QUOTE_START, 3, "").setIcon(quote_quick).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(Menu.NONE, QUOTE_ADD, 2, "").setIcon(quote_add).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(Menu.NONE, CUSTOM_COPY, 1, "").setIcon(copy).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
De acuerdo con https://developer.android.com/guide/topics/ui/menus#CAB , debe crear el menú en onCreateActionMode.
Lo hice así (en kotlin):
val actionModeCallbackA = object : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, p1: MenuItem?): Boolean {
Log.wtf("ACTION MODE", "onActionItemClicked")
actionModeB = startActionMode(actionModeCallbackB)
return true
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
Log.wtf("ACTION MODE", "onCreateActionMode")
val inflater = mode?.getMenuInflater()
inflater?.inflate(R.menu.context_menu, menu)
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
Log.wtf("ACTION MODE", "onPrepareActionMode")
return false
}
override fun onDestroyActionMode(p0: ActionMode?) {
Log.wtf("ACTION MODE", "onDestroyActionMode")
actionModeA = null
}
}
Sólo algunos pensamientos. ¿Qué onCreateOptionsMenu
si toma el elemento de menú onCreateOptionsMenu
y lo cambia?
Me gusta esto:
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
new Handler().post( -> {
final View menuItemView = findViewById(R.id.menu_action_item);
...
}
}