具有Android + MIUI和setCustomSelectionActionModeCallback的设备

我正在尝试创建自定义选择菜单,但它不适用于具有ROM MIUI和Android 6的设备。结果是具有“复制”和“全选”项目的常用菜单。 在干净的Android下的其他设备和模拟器上它工作得很好。 代码

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

Solutions Collecting From Web of "具有Android + MIUI和setCustomSelectionActionModeCallback的设备"

只是一些想法。 如果您使用onCreateOptionsMenu菜单项并进行更改,该怎么办?

喜欢这个:

 public boolean onCreateOptionsMenu(final Menu menu) { getSupportMenuInflater().inflate(R.menu.main, menu); new Handler().post( -> { final View menuItemView = findViewById(R.id.menu_action_item); ... } } 

所以我想出了一个解决方法,但只有你绝对需要它才能在MIUI设备上工作才有意义。 这通常有点尴尬:

我注意到维基百科应用程序在小米设备上有自定义操作,在查看代码后我发现它在WebView选择文本时工作正常。 您基本上可以使用WebView并覆盖Activity中的 onActionModeStarted

Acivity:

 String html = "< !DOCTYPE html>\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "

WebView text

\n" + "\n" + "\n" + "\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); }

菜单:

     

结果: 结果

根据https://developer.android.com/guide/topics/ui/menus#CAB,您需要在onCreateActionMode中创建菜单。

我这样做了(在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 } }