Verwenden Sie eine benutzerdefinierte contextual action bar für die WebView-text-Auswahl
Habe ich verwendet diese Anleitung von Google und dieses tutorial zu produzieren, meine eigenen contextual action bar.
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
//Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
//Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.annotation_menu, menu);
return true;
}
//Called each time the action mode is shown.
//Always called after onCreateActionMode, but
//may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; //Return false if nothing is done
}
//Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.custom_button:
//do some stuff
break;
case R.id.custom_button2:
//do some other stuff
break;
default:
//This essentially acts as a catch statement
//If none of the other cases are true, return false
//because the action was not handled
return false;
}
finish(); //An action was handled, so close the CAB
return true;
}
//Called when the user exits the action mode
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
};
In diesem Menü ist entworfen, um angezeigt, wenn der Benutzer markiert den text, so überschreibt es die native kopieren/einfügen-Menü. Jetzt komme ich zu meinem Problem.
Weil ich bin übergeordnete Funktionen für Textauswahl, ich habe auch einen LongClickListener
zu einem WebView
und implementiert die onLongClick(View v)
Methode, so kann ich erkennen, wenn der Benutzer die Auswahl treffen.
myWebView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mActionMode != null) {
return false;
}
mActionMode = startActionMode(mActionModeCallback);
v.setSelected(true);
return true;
}
});
Wenn ich lange auf, ich sehe meine benutzerdefinierte Menü angezeigt, aber kein text markiert ist.
Ich muss die text-Auswahl-Funktionen; ohne es, mein Menü ist sinnlos.
Wie kann ich überschreiben onLongClick(View v)
aber halten Sie die text-Auswahl zur Verfügung gestellt von Android?
Wenn das nicht möglich ist, kann ich den Aufruf zu startActionMode(mActionModeCallback)
woanders, so dass text ausgewählt werden, als normal, aber mein benutzerdefiniertes Menü auch angezeigt werden?
Wenn keines von beidem möglich sind... Hilfe.
InformationsquelleAutor der Frage Dirty Beach | 2014-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
GIBT ES EINEN EINFACHEREN WEG! Siehe update unten 😀
Der Vollständigkeit halber, hier ist, wie ich das problem behoben:
Folgte ich dem Vorschlag nach diese Antwortmit ein wenig mehr optimieren, um mehr eng mit den überschriebenen code:
Im wesentlichen, diese Kräfte Ihre individuelle KABINE anstelle der Android-TAXI. Jetzt müssen Sie ändern Sie Ihre callback, so dass Sie den text markieren gehen Weg zusammen mit dem TAXI:
Das ist alles dort ist zu ihm. Werden Sie sich bewusst, dass solange Sie mit
MyWebView
mit der überschriebenenstartActionMode
es gibt KEINEN WEG, um die native CAB (die kopieren/einfügen-Menü, im Falle einer WebView). Kann es möglich sein, zu implementieren, die Art von Verhalten, aber das ist nicht die Art, wie dieser code funktioniert.UPDATE: Es ist ein viel einfacher Weg, dies zu tun! Die obige Lösung funktioniert gut, aber hier ist eine alternative, einfacher Weg.
Diese Lösung bietet weniger Kontrolle über die
ActionMode
aber es erfordert viel weniger code als die obige Lösung.Hier ist ein Beispiel-Menü, um Ihnen den Einstieg:
Das ist es! Sie sind fertig! Jetzt ist Ihre benutzerdefinierte Menü erscheint, die Sie nicht haben, um sorgen über die Auswahl, und Sie werden kaum haben Sie sich mit der
ActionMode
Lebenszyklus.Dieser funktioniert fast einwandfrei mit einem
WebView
nimmt seine gesamte übergeordneteActivity
. Ich bin nicht sicher, wie gut es funktionieren wird, wenn es mehrereView
s in IhremActivity
zu einer Zeit. Es wird wahrscheinlich erfordern einige Anpassungen in diesem Fall.InformationsquelleAutor der Antwort Dirty Beach
Dem Weg habe ich etwas ähnliches war nur das überschreiben der onTouchListener und zum aufrufen einer GestureDetector zu erkennen, wenn die WebView wurde lange gedrückt, und tun, was ich wollte, von dort aus. Hier einige Beispiel-code, ermöglicht es Ihnen, zu fangen, lang-Presse-events ohne Einbußen bei der text-Auswahl in der Webansicht. Hoffentlich hilft.
InformationsquelleAutor der Antwort anthonycr