在android上禁用setMovementMethod(LinkMovementMethod.getInstance())

休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述在android上禁用setMovementMethod(LinkMovementMethod.getInstance())相关的知识,希望能为你提供帮助。
我在我的android应用程序中使用setMovementMethod(LinkMovementMethod.getInstance()) for EditText视图。 EditText中的链接工作正常但在某些情况下我需要以编程方式禁用此方法(因为在longClick菜单中启用复制项目)。怎么做?我需要像“removeMovementMethod()”这样的东西。
你能帮助我吗?
谢谢!
答案

setMovementMethod(null)

将textview的movement方法设置为null。如果您的代码想要以某种方式处理MovementMethod,这当然会导致NullPointerException。
另一答案在setMovementMethod(null) longClick菜单将禁用。因此更好地使用此方法:
setMovementMethod(ArrowKeyMovementMethod.getInstance())

另一答案就像@lubart在其中一个答案中评论的那样,设置setMovementMethod(null)将不起作用。在设置LinkMovementMethod之前,您需要保存先前的MovementMethod,并在不想使用LinkMovementMethod时再次恢复它。
我要强调的一件重要事情是,在恢复到之前的MovementMethod时必须设置AutoLinkMask = 0,否则链接不会消失,插入符号将不显示,并且不会出现复制/粘贴上下文菜单。
此外,在使用setMovementMethod之后,再次在EditText / TextView中设置文本以应用移动方法。
算法(不是代码):
设置链接移动方法 -
previousMovementMethod = editText.MovementMethod; editText.autoLinkMask = All; editText.MovementMethod = LinkMovementMethod.GetInstance(); editText.SetText(editText.GetText());

删除链接移动方法 -
editText.autoLinkMask = 0; editText.MovementMethod = previousMovementMethod; editText.SetText(editText.GetText());

另一答案试一试: - 在你的项目中添加这个类
import android.text.Layout; import android.text.Selection; import android.text.Spannable; import android.text.method.ArrowKeyMovementMethod; import android.text.method.MovementMethod; import android.text.style.ClickableSpan; import android.view.MotionEvent; import android.widget.TextView; /** * Created by Nishu on 20-08-2015. */ 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, MotionEventevent) { 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); }}

【在android上禁用setMovementMethod(LinkMovementMethod.getInstance())】现在使用EditText添加下面的代码行
YourEditText.setMovementMethod(MyMovementMethod.getInstance());

并从editText中删除所有类型的setMovementMethod就是这样:)
另一答案正如user5211136所说,你可以使用自定义ArrowKeyMovementMethod。然后文本将是可选择的,超链接也将起作用。但用户5211136的类的使用称为错误
“找不到意图的活动,Intent {act = android.intent.action.VIEW dat = https:// ...(has extras)}”
为了我。
这就是我使用这个课程的原因:
public class CustomArrowKeyMovementMethod extends ArrowKeyMovementMethod {public static MovementMethod getInstance(){ return new CustomArrowKeyMovementMethod(); }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); URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { String url = link[0].getURL().trim(); if(url.startsWith("www")) { url = "http://" + url; } if (url.startsWith("https://") || url.startsWith("http://") || url.startsWith("tel:") || url.startsWith("mailto:")) { try { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); widget.getContext().startActivity(browserIntent); } catch (Exception e) { Toast.makeText(widget.getContext(), "Couldn't open url", Toast.LENGTH_LONG).show(); } } } else { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; } } return super.onTouchEvent(widget, buffer, event); } }

并称之为:
textView.setMovementMethod();


    推荐阅读