Ik probeer een aangepast selectiemenu te maken, maar het werkt niet op een apparaat met ROM MIUI en Android 6. Het resultaat is een algemeen menu met copy
en select all
artikelen. Op andere apparaten en simulators onder schone Android werkt het prima.
De code:
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) {
}
});
Antwoord 1, autoriteit 100%
Dus ik heb een tijdelijke oplossing bedacht, maar het heeft alleen zin als je het absoluut nodig hebt om op MIUI-apparaten te werken. Het is over het algemeen een beetje onhandig:
Ik heb gemerkt dat de Wikipedia-app aangepaste acties heeft die werken op een Xiaomi-apparaat, en nadat ik de code had bekeken, ontdekte ik dat het prima werkt als de teksten zijn geselecteerd in een WebView
.
U kunt in principe een WebView
gebruiken en onActionModeStarted
overschrijven in uw Activiteit
Activiteit:
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);
}
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" />
Antwoord 2
Gewoon wat gedachten. Wat als u menu-item onCreateOptionsMenu
neemt en het wijzigt.
Zoals dit:
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
new Handler().post( -> {
final View menuItemView = findViewById(R.id.menu_action_item);
...
}
}
Antwoord 3
Volgens https://developer.android.com/guide/topics /ui/menus#CABje moet een menu maken in onCreateActionMode.
Ik heb het zo gemaakt (in 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
}
}
Antwoord 4
Ik had een soortgelijk probleem, misschien kan mijn oplossing iemand helpen. Ik moest een weergave maken bestaande uit verschillende horizontale aangrenzende EditText
‘s, en de mogelijkheid toevoegen om er tekst in te plakken (één letter tekst in één editText)
Ik gebruikte de aanpak van ActionMode.Callback
en het werkte prima, behalve Xiaomi-apparaten. De oplossing voor Xiaomi-apparaten was het gebruik van OnLongClickListener
bij het bewerken van teksten en het maken van PopupMenu
bij een lange klik:
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;
});