Android:使用LinkMovementMethod编辑文本

时间:2011-10-12 14:28:26

标签: android android-widget

我基本上想了解 LinkMovementMethod 类。我在编辑文本中有一个需要可点击的图像。所以我使用LinkMovementMethod.getInstance来编辑文本。但是由于此LinkMovementMethod对象,用于编辑文本(如复制,剪切,粘贴)的上下文菜单(长按)选项不可见。此外,我无法将光标定位在编辑文本中。不知何故,光标正在隐藏。

在编辑文本中使用LinkMovementMethod是否正确?是否有必要为游标和上下文菜单问题编写自定义LinkMovementMethod类。

     EditText editText = (EditText)findViewById(R.id.text);
     editText.setMovementMethod(LinkMovementMethod.getInstance());

-Regards, 罗恩..

2 个答案:

答案 0 :(得分:2)

您不应将LinkMovementMethod与可编辑文本一起使用。 LinkMovementMethod是一种移动方法,可让您在链接之间移动...这不是您想要的文本编辑器,因为您应该使用移动光标进行编辑的移动方法。

您对可编辑文本中的链接有什么期望?当您具有可编辑文本时,点击文本会将光标置于该点以进行编辑。它不会打开链接。这是两个相互矛盾的事情。如果您想要有其他一些行为,则需要自定义文本视图以执行特殊操作,并弄清楚如何在编辑链接文本和打开链接文本之间消除歧义(例如,Google文档向您显示弹出窗口如果您不想编辑,请选择打开它)。但是你需要自己编写代码,没有神奇的内置函数可以在当前框架中实现它。

答案 1 :(得分:1)

一种方法是extends EditText

import android.content.Context;
import android.text.Layout;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;

public class Edit extends EditText {

    public Edit(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public Edit(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Edit(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean b = super.onTouchEvent(event);

        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= getTotalPaddingLeft();
        y -= getTotalPaddingTop();

        x += getScrollX();
        y += getScrollY();

        Layout layout = getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        setSelection(off);

        /**
         * get you interest span
         */
        ImageSpan[] link = getText().getSpans(off, off, ImageSpan.class);
        System.out.println("---link---" + link.length);
        if (link.length != 0) {
            String src = link[0].getSource();
            System.out.println("---src---" + src);
            return true;
        }
        return b;
    }
}