问题:
长话短说,我想clickable
Drawable
在EditText
.
研究:
我已经阅读了一些文档以及相关问题,并且几乎达到了我想要的结果(请参阅“代码”部分)。这有点棘手,但我无法找到其他出路。我Html.fromHtml(source, imageGetter, tagHandler)
用一个链接插入我需要的drawable,然后实现一个自定义LinkMovementMethod
来处理它的点击。
但有一些事情我想避免:
- 如果在我的可绘制对象之后没有文本,即使我点击它的任何地方,它也会被点击。所以我不能在不手动移动光标的情况下将光标放在它旁边。
EditText
在某些设备上,每次单击时光标都会出现在最开始时,但单击可绘制对象时除外。
代码:
插入带有链接的drawable并设置自定义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));
自定义LinkMovementMethod
:
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>
问题:
- 有什么方法可以避免我在“研究”部分末尾使用这种方法描述的事情?
- 我应该使用另一种方法吗?
将很高兴阅读建议或任何想法。谢谢你。