puro one android textview

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" />

Resultado:

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); ... } }