我尝试创建自定义选择菜单,但它不适用于使用rom MIUI和Android 6的设备。结果是常用菜单" copy"和"选择所有"项目。在干净的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) {
}
});
答案 0 :(得分:0)
只是一些想法。如果您选择菜单项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);
...
}
}
答案 1 :(得分:0)
所以我想出了一种解决方法,但是只有当您绝对需要它可以在MIUI设备上工作时,它才有意义。通常有点尴尬:
我注意到Wikipedia应用程序具有在小米设备上运行的自定义操作,在查看代码后,我发现当在WebView
中选择文本时,它可以正常工作。
您基本上可以在您的活动
WebView
并覆盖onActionModeStarted
主动性:
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);
}
菜单:
<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" />
答案 2 :(得分:0)
根据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
}
}
答案 3 :(得分:0)
我有类似的问题,也许我的解决方案可以帮助某人。我必须制作一个由几个水平相邻EditText
组成的视图,并添加将文本粘贴到其中的功能(一个文本字母到一个editText)
我使用了ActionMode.Callback
的方法,除小米设备外,它工作正常。小米设备的解决方案是在编辑文本上使用OnLongClickListener
并在长按上创建PopupMenu
:
editText.setOnLongClickListener(v -> {
PopupMenu menu = new PopupMenu(context,v);
MenuInflater inflater = menu.getMenuInflater();
inflater.inflate(R.menu.paste_menu_item, menu.getMenu());
menu.setOnMenuItemClickListener(item -> {
pasteText();//some custom function to handle selected action
return false;
});
menu.show();
return true;
});