Хотя этот будет работать, возможно, будет лучшее решение, если вы хотите, чтобы ваш TextView
действовал больше как стандарт EditText
и отображал контекстное меню.
Вы можете сделать что-то вроде этого
class SomeActivity : AppCompatActivity() {
override fun onCreate() {
// super.onCreate() and setContentView() calls ommited for clarity
// Assuming that pastableTextView is the TextView you want to paste into
registerForContextMenu(pastableTextView)
}
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
// oversimplified for sake of example
if (v?.id == pastableTextView.id) {
menu?.add(0, v.id, 0, android.R.string.paste)
}
}
override fun onContextItemSelected(item: MenuItem?): Boolean {
// again, oversimplified for the sake of example
if (item?.itemId == pastableTextView.id) {
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
// This is clipboard's contents
val content = clipboardManager?.primaryClip?.getItemAt(0)?.text?
}
return false
}
}
Имейте в виду, что этот код не является оптимальным, и я не рекомендую использовать его для производственного приложения, как есть.
Это похоже на ошибку.
Если Вы компилируете с dcu's отладки (обычно не делают этого, если Вы не хотите освободить свою исправность!) Вы видите, что вызов к компаратору пошел не так, как надо. (Возможно дополнительный) третье значение сравнить функции не установлено и вызывает нарушение прав доступа.
Так возможно Вы не можете поместить указатели метода в универсальный список.
Хорошо следующие работы:
uses
Generics.Defaults;
type
TForm4 = class(TForm)
...
private
procedure myNotifyEvent(Sender: TObject);
end;
TComparer<T> = class (TInterfacedObject, IComparer<T>)
public
function Compare(const Left, Right: T): Integer;
end;
implementation
uses
Generics.Collections;
var
list: TList<TNotifyEvent>;
begin
list := TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Create);
try
list.Add(myNotifyEvent);
list.Remove(myNotifyEvent);
finally
FreeAndNil(list);
end;
end;
procedure TForm4.myNotifyEvent(Sender: TObject);
begin
ShowMessage('event');
end;
{ TComparer<T> }
function TComparer<T>.Compare(const Left, Right: T): Integer;
begin
Result := 0;
end;
Необходимо определить собственный компаратор с possiby еще некоторая аналитика ;-).
вышеупомянутый код используется в TForm1...
uses
Generics.Collections;
procedure TForm1.Button1Click(Sender: TObject);
var
list: TList<TNotifyEvent>;
begin
list := TList<TNotifyEvent>.Create();
try
list.Add(myNotifyEvent);
list.Remove(myNotifyEvent); // EAccessViolation at address...
finally
FreeAndNil(list);
end;
end;
procedure TForm1.myNotifyEvent(Sender: TObject);
begin
OutputDebugString('event'); // nebo cokoliv jineho
end;
Действительно ли возможно передать пользовательский компаратор TList<T>
? У меня нет D2009 передо мной, так не может попробовать его.
Нарушение доступа вызвано отсутствием сравнителя. Я подозреваю, что это было исправлено в патче, но проблема все равно остается (по крайней мере, в Delphi 2009), если вы используете TObjectList, так что я просто обновляю простейшее решение:
TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Default);
или в моем случае
TObjectList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Default);