問題:
clickable
Drawable
簡単に言うと、カスタム(または小さなボタンのように見え、1 つの文字のように機能するもの) を .xml 内に挿入したいと思いますEditText
。
リサーチ:
いくつかのドキュメントと関連する質問を読みましたが、必要な結果をほぼ達成しました(「コード」セクションを参照)。少しトリッキーですが、別の方法を見つけることができませんでした。Html.fromHtml(source, imageGetter, tagHandler)
リンクで必要なドローアブルを挿入するために使用してから、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>
質問:
- このアプローチを使用して、「研究」セクションの最後で説明したことを回避する方法はありますか?
- 私が使用すべき別のアプローチはありますか?
アドバイスやアイデアを読んで喜んでいます。ありがとうございました。