我setMovementMethod(LinkMovementMethod.getInstance())
在我的 android 应用程序中使用 EditText 视图。EditText 中的链接工作正常,但在某些情况下,我需要通过程序禁用此方法(因为在 longClick 菜单中启用复制项)。怎么做?我需要像“removeMovementMethod()”这样的东西。
你能帮助我吗?
谢谢!
我setMovementMethod(LinkMovementMethod.getInstance())
在我的 android 应用程序中使用 EditText 视图。EditText 中的链接工作正常,但在某些情况下,我需要通过程序禁用此方法(因为在 longClick 菜单中启用复制项)。怎么做?我需要像“removeMovementMethod()”这样的东西。
你能帮助我吗?
谢谢!
在遇到同样的问题后,请考虑一下,设置方法似乎有一定的顺序。
final TextView tv = new TextView(getContext());
tv.setLayoutParams(lp_tv);
Linkify
文本中的所有链接标记为Link
tv.setAutoLinkMask(Linkify.ALL);
TextView
(后setAutoLinkMask
)的内容tv.setText("MyText")
tv.setText(Html.fromHtml("<big>MyText</big>");
LinkMovementMethod
. 如果之前附加了该方法,它将调用默认行为并打开系统浏览器。我使用一个TextViewLinkHandler
类来完成这项工作作为个人行为。标准行为是:tv.setLinkMovementMethod(new LinkMovementMethod.getInstance());
如果用户点击一个链接(例如打开一个单独的 Intent 来处理 URL),我会使用它TextViewLinkHandler
来做一些其他的事情
tv.setMovementMethod(new TextViewLinkHandler() {
// do my stuff ...
// if left blank, nothing will happen on click at the link, so leave it blank to do nothing
});
与提到的TextViewLinkHandler()
public abstract class TextViewLinkHandler extends LinkMovementMethod {
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_UP)
return super.onTouchEvent(widget, buffer, event);
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) {
onLinkClick(link[0].getURL());
}
return true;
}
abstract public void onLinkClick(String url);
}
长按菜单后setMovementMethod(null)
会禁用。因此最好使用这种方法:
setMovementMethod(ArrowKeyMovementMethod.getInstance())
setMovementMethod(null)
会将 textview 的移动方法设置为 null。如果您的代码想要以某种方式处理 MovementMethod,这当然会导致 NullPointerException。
就像@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());
正如 user5211136 所说,您可以使用自定义 ArrowKeyMovementMethod。然后文本将是可选的,超链接也将起作用。但是 user5211136 类的使用称为错误
“未找到意图的活动,意图 { act=android.intent.action.VIEW dat= https://...(有附加功能)}”
为了我。
这就是我使用这个类的原因:
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();
试试看:- 在你的项目中添加这个类
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 中删除所有类型的 setMovementMethods 就是这样:)