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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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, 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);
 }

}

现在使用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();

以上是关于在android上禁用setMovementMethod(LinkMovementMethod.getInstance())的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上禁用方向更改?

如何在 Android 的 chrome 上禁用缓存?

如何在 Android 上启用/禁用蓝牙硬件初始化日志记录?

Android 在视图上禁用多点触控

在 ListView 上禁用波纹

禁用在 android 上显示 Paypal Web 浏览器