lub*_*art 5 android copy hyperlink android-edittext
我的EditTextAndroid应用中有一个视图.我需要"内部链接",这意味着我需要一些按钮或跨越内部EditText,onClick我可以执行一些操作(不重定向到网页).我用ClickableSpan()这样的方式实现了这个按钮
linkWord = "my link";
link = new SpannableString(linkWord);
cs = new ClickableSpan(){
private String w = linkWord;
@Override
public void onClick(View widget) {
wrd.setText(w);
}
};
link.setSpan(cs, 0, linkWord.length(), 0);
et.append(link);
Run Code Online (Sandbox Code Playgroud)
为了使这个跨度可点击我使用
et.setMovementMethod(LinkMovementMethod.getInstance());
"内部链接"工作正常,但使用et.setMovementMethod()复制和粘贴项目后禁用OnLongClick菜单.这是一个问题,因为我需要"链接" EditText并同时复制此视图中的文本.
我有想法设置监听器的OnLongClickListener东西,如removeMovementMethod()临时禁用"链接"功能和使用菜单与复制/粘贴和再次处理文本切换setMovementMethod()方法后.但我不知道如何实现这一点.
你能帮助我吗?你可能还有另外一些方法......
谢谢!
Ema*_*lin 16
我不认为让用户在链接和复制模式之间切换会赢得可用性奖.我的解决方案允许您选择文本并同时打开链接.为了实现这一点,我只需要扩展ArrowKeyMovementMethod,它允许选择文本,并从LinkMovementMethod中添加onTouchEvent()方法,该方法处理链接的点击/触摸.只有一行代码需要更改,即在触摸屏幕的坐标处找不到链接时,从TextView中删除选择的代码.
这是完整的课程:
public class MyMovementMethod extends ArrowKeyMovementMethod {
private static MyMovementMethod sInstance;
public static MovementMethod getInstance() {
if (sInstance == null) {
sInstance = new MyMovementMethod ();
}
return sInstance;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
}
else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
}
return true;
}
/*else {
that's the line we need to remove
Selection.removeSelection(buffer);
}*/
}
return super.onTouchEvent(widget, buffer, event);
}
}
Run Code Online (Sandbox Code Playgroud)
即使文档说明,这样做也是非常安全的:
此接口[MovementMethod]旨在供框架使用; 它不应该由应用程序直接实现. http://developer.android.com/reference/android/text/method/MovementMethod.html
上面的代码扩展了一个记录的类而不是实现接口.它所做的只是添加一个检查以查看链接是否被点击,否则使用超类方法.
我解决了这个问题,也许这对某人来说会很有趣......
对于我使用的 EditText 内的可点击链接
et.setMovementMethod(LinkMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,长单击菜单中没有复制/粘贴项目。为了激活它们,我需要回到正常的 EditText 状态,我可以这样做:
et.setMovementMethod(ArrowKeyMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)
使用此方法后,链接将不起作用,但会出现正常的长点击菜单。
因此,我向上下文菜单添加了新项目并在这两个选项之间切换:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if(et.getSelectionStart() == -1){ // in case of setMovementMethod(LinkMovementMethod.getInstance())
menu.add(0, 1, 0, "Enable copy");
}
else{
menu.add(0, 2, 0, "Enable links");
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
et.setMovementMethod(ArrowKeyMovementMethod.getInstance());
et.setSelection(0, 0);
//re-register EditText for context menu:
unregisterForContextMenu(et);
registerForContextMenu(et);
break;
case 2:
et.setMovementMethod(LinkMovementMethod.getInstance());
break;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我还为上下文菜单注册了 EditText:
registerForContextMenu(et);
Run Code Online (Sandbox Code Playgroud)
希望这会对某人有所帮助!
| 归档时间: |
|
| 查看次数: |
4776 次 |
| 最近记录: |