我正在尝试创建一个EditText
,其中不能选择任何文本,但仍然可以由用户进行搜索。
要归档第一个功能,请创建自定义OnTouchListener
并仅响应ACTION_DOWN
这样的事件:
View.OnTouchListener otl = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
scroll_down_x = event.getX();
Layout layout = ((EditText) v).getLayout();
float x = event.getX() + mText.getScrollX();
int offset = layout.getOffsetForHorizontal(0, x);
if(offset>0)
if(x>layout.getLineMax(0))
mText.setSelection(offset); // touch was at end of text
else
mText.setSelection(offset - 1);
break;
}
return true;
}
};
mText.setOnTouchListener(otl);
但这也会禁用滚动。然后,我尝试reimplement
ACTION_MOVE
事件与
case MotionEvent.ACTION_MOVE:
String input = ((EditText)v).getText().toString();
float width = ((EditText) v).getPaint().measureText(input);
float cwidth = ((EditText)v).getWidth();
//only scroll when the text is too long for the control
if (width >cwidth )
{
layout = ((EditText) v).getLayout();
x = event.getX() - scroll_down_x;
offset = layout.getOffsetForHorizontal(0, x);
mText.scrollBy((int) x, mText.getScrollY());
}
return true;
但这根本不起作用 - 滚动不是很平滑也很不准确。
那么,我如何改进这个“滚动”代码或解决EditText
的问题,其中没有文本可以选择,但用户仍然可以滚动?
编辑:用户仍然可以更改光标位置。
答案 0 :(得分:0)
经过一些实验,我终于想到了一些有用的东西。
final EditText mText = (EditText) findViewById(R.id.input);
View.OnTouchListener otl = new View.OnTouchListener() {
private float scroll_down_x;
final static int right_border = 20;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
scroll_down_x = event.getX();
Layout layout = ((EditText) v).getLayout();
float x = event.getX() + mText.getScrollX();
int offset = layout.getOffsetForHorizontal(0, x);
if(offset>0)
if(x>layout.getLineMax(0))
mText.setSelection(offset); // touch was at end of text
else
mText.setSelection(offset - 1);
break;
case MotionEvent.ACTION_MOVE:
String input = ((EditText)v).getText().toString();
float width = ((EditText) v).getPaint().measureText(input);
float cwidth = ((EditText)v).getWidth();
//only scroll when the text is too long for the control
if (width >= cwidth) {
layout = ((EditText) v).getLayout();
x = event.getX() - scroll_down_x;
scroll_down_x = event.getX();
//do not scroll over the left border
if (((EditText) v).getScrollX() + (int)x >= 0) {
//do not scroll over the right border
if ((int)cwidth+((EditText) v).getScrollX()-right_border + x <= (int)width)
{
offset = layout.getOffsetForHorizontal(0, x);
mText.scrollBy((int) x, 0);
}
else
{
mText.scrollTo((int)(width-cwidth+right_border), 0);
}
}
else
{
mText.scrollTo(0, 0);
}
}
}
return true;
}
};
此代码允许用户设置光标并滚动一行EditText
,它将隐藏系统键盘。
我希望它会对某人有所帮助。如果没有更方便的方法来归档此行为,我仍然感兴趣。
答案 1 :(得分:-1)
如果您想在不编辑的情况下显示任何信息,可以使用TextView(请参阅此帖子https://stackoverflow.com/a/3256305/2697368)而不是Edittext,但如果您想要EditText,请尝试使用以下代码:
<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cursorVisible="false"
android:focusable="false"
android:inputType="textMultiLine"
android:scrollbars="vertical"
android:text="Long Text here" />
如果要启用用户版,请使用以下代码:
EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public void onDestroyActionMode(ActionMode mode) {
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
});
}