Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编辑文本中的可单击项_Android_Android Edittext - Fatal编程技术网

Android 编辑文本中的可单击项

Android 编辑文本中的可单击项,android,android-edittext,Android,Android Edittext,问题: 长话短说,我想在编辑文本中插入一个自定义的可点击的可绘制的(或者看起来像一个小按钮,作用类似单个字符的东西) 研究: 我已经阅读了一些文档以及相关的问题,我几乎达到了我想要的结果(参见“代码”部分)。这有点棘手,但我没能找到另一条出路。我正在使用Html.fromHtml(source,imageGetter,tagHandler)插入我需要的带有链接的可绘图文件,然后实现一个自定义LinkMovementMethod来处理对它的点击 但有些事情我想避免: 如果在我的drawable之后

问题:

长话短说,我想在
编辑文本
中插入一个自定义的
可点击的
可绘制的
(或者看起来像一个小按钮,作用类似单个字符的东西)

研究:

我已经阅读了一些文档以及相关的问题,我几乎达到了我想要的结果(参见“代码”部分)。这有点棘手,但我没能找到另一条出路。我正在使用
Html.fromHtml(source,imageGetter,tagHandler)
插入我需要的带有链接的可绘图文件,然后实现一个自定义
LinkMovementMethod
来处理对它的点击

但有些事情我想避免:

  • 如果在我的drawable之后没有文本,即使我单击了它的任何位置,它也会被单击。因此,如果不手动移动光标,我无法将光标放置在它旁边
  • 在某些设备上,每次单击时,光标都会出现在
    EditText
    的最开始处,单击“可绘制”时除外
  • 代码:

    插入带有链接的可绘图文件并设置自定义
    LinkMovementMethod

    Html.ImageGetter imgGetter = new Html.ImageGetter() {
    
        @Override
        public Drawable getDrawable(String source) {
    
            Drawable drawable = getResources().getDrawable(R.drawable.blip_icon_read);
    
            //Making it as small as a character
            drawable.setBounds(0, 0, (int)getTextSize(), (int)getTextSize());
    
            return drawable;
        }
    };
    
    String buttonSrc = "<a href='button://" + "somedata" + "'><img src=/></a>";
    
    myEditText.append(Html.fromHtml(buttonSrc, imgGetter, null));
    myEditText.setMovementMethod(MyLinkMovementMethod.getInstance(context));
    
    public class MyLinkMovementMethod extends LinkMovementMethod {
    
        private static Context movementContext;
    
        private static MyLinkMovementMethod linkMovementMethod = new MyLinkMovementMethod();
    
        public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event) {
    
            int action = event.getAction();
    
            if (action == MotionEvent.ACTION_UP) {
    
                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) {
    
                    URI uri;
    
                    try {
                        uri = new URI(link[0].getURL());
                    } catch (URISyntaxException e) {
                        e.printStackTrace();
                        return true;
                    }
    
                    if (uri.getScheme().equals("button")) {
                        //Doing stuff here
                    }
                    return true;
                }
            }
    
            return super.onTouchEvent(widget, buffer, event);
        }
    
        public static android.text.method.MovementMethod getInstance(Context c) {
            movementContext = c;
            return linkMovementMethod;
        }
    }
    
    布局:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <EditText
            android:id="@+id/my_edit_text"
    
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:textColor="@android:color/black"
            android:scrollbars="vertical"
            android:textCursorDrawable="@null"
            android:gravity="top" >
    
        </EditText>
    
    </LinearLayout>
    
    
    
    问题:

  • 有没有什么方法可以避免我在“研究”一节末尾描述的使用这种方法的事情
  • 我是否应该使用其他方法
  • 将乐于阅读建议或任何想法。谢谢。

    这似乎有效(除非我真的不理解你的想法)

    要测试它,请在Activity.onCreate中添加以下内容:

    LinearLayout ll = new LinearLayout(this);
    EditText et = new EditText(this);
    SpannableStringBuilder b = new SpannableStringBuilder();
    b.append("Attach the specified markup object to the ");
    int start = b.length();
    b.append("x");
    int end = b.length();
    b.append(" range start end of the text, or move the object to that range if it was...");
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    b.setSpan(new MyClickableSpan(bitmap), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    et.setText(b);
    et.setMovementMethod(new MyMovementMethod());
    ll.addView(et);
    setContentView(ll);
    

    只需使用ScrollView,因为parentView将帮助您。 像这样

    <ScrollView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginBottom="45dp"
         android:layout_below="@id/header_container"
         >
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
             >
             <EditText
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:id="@+id/title"
                 android:hint="输入标题"
                 android:layout_marginStart="15dp"
                 android:layout_marginLeft="15dp"
                 android:layout_marginRight="15dp"
                 android:layout_marginEnd="15dp"
                 android:inputType="text"
                 android:textSize="22sp"
                 android:singleLine="true"
                 android:textCursorDrawable="@color/cursor_white"
                 android:background="@drawable/bg_edittext_title_white"
                 android:padding="5dp"
                 >
             </EditText>
    
             <EditText
                 android:id="@+id/content"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:background="@null"
                 android:gravity="start|top"
                 android:layout_marginLeft="15dp"
                 android:layout_marginStart="15dp"
                 android:layout_marginRight="15dp"
                 android:layout_marginEnd="15dp"
                 android:layout_marginTop="10dp"
                 android:inputType="textMultiLine"
                 android:minHeight="220dp"
                 android:singleLine="false"
                 android:textCursorDrawable="@color/cursor_white"
                 android:hint="输入内容"
                 android:padding="5dp"
                 />
         </LinearLayout>
    
     </ScrollView>
    
    
    
    See@ramaral据我所知,使用这种方法,我将无法强制它(按钮)表现得像一个角色。即使我会,这将是一个巨大的工作围绕。为什么你想要一个可点击的跨度内编辑文本?为什么不是一个普通的按钮?见@ramaral谢谢你。我过一会儿再查。谢谢你,好心的先生。我明天会检查。不幸的是,这种方法也有同样的问题。最后,问题是,当我的drawable之后的行中没有任何内容时,EditText会将光标放在它旁边,即使我在EditText的末尾单击。我知道,这是一种正常的行为,但我想知道是否有任何方法可以阻止我的按钮被点击。目前,我正在考虑在我的按钮旁边放置一个空格字符。这是一个解决办法,但它将解决“不需要的点击问题”。我接受你的回答有两个原因:1。它比我的更简单、更明显。2.由于扩展了
    ArrowKeyMovementMethod
    ,因此它不会禁用longClick事件,而
    LinkMovementMethod
    会禁用。谢谢。请将链接[0]替换为。如果关闭,则使用doSomething!=buffer.length()链接[0].doSomething()不,仍然相同。
    <ScrollView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginBottom="45dp"
         android:layout_below="@id/header_container"
         >
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
             >
             <EditText
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:id="@+id/title"
                 android:hint="输入标题"
                 android:layout_marginStart="15dp"
                 android:layout_marginLeft="15dp"
                 android:layout_marginRight="15dp"
                 android:layout_marginEnd="15dp"
                 android:inputType="text"
                 android:textSize="22sp"
                 android:singleLine="true"
                 android:textCursorDrawable="@color/cursor_white"
                 android:background="@drawable/bg_edittext_title_white"
                 android:padding="5dp"
                 >
             </EditText>
    
             <EditText
                 android:id="@+id/content"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:background="@null"
                 android:gravity="start|top"
                 android:layout_marginLeft="15dp"
                 android:layout_marginStart="15dp"
                 android:layout_marginRight="15dp"
                 android:layout_marginEnd="15dp"
                 android:layout_marginTop="10dp"
                 android:inputType="textMultiLine"
                 android:minHeight="220dp"
                 android:singleLine="false"
                 android:textCursorDrawable="@color/cursor_white"
                 android:hint="输入内容"
                 android:padding="5dp"
                 />
         </LinearLayout>
    
     </ScrollView>