更具体地说,我已经做过这种行为的小例子。
布局:
<ScrollView
android:id="@+id/scroll_view_for_et"
android:scrollbars="horizontal"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="top"
android:text="Long text there" />
</ScrollView>
活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText editText = (EditText) findViewById(R.id.edit_text);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Adding random span to text
editText.getEditableText().setSpan(new ForegroundColorSpan(Color.RED), 100, 500, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}, 7000);
}
因此,如果我在某个地方设置光标,然后在其他位置滚动文本,经过7秒后,它将滚动回到光标位置。如何避免这种行为?
BitBucket link获取此示例的完整代码。
答案 0 :(得分:0)
我找到了一些解决方案。问题在于,在执行setSpan
方法后,EditText收到了焦点。所以我在我的视图层次结构中添加了android:descendantFocusability="beforeDescendants"
(在我的例子中是LinearLayout),而OnTouchListener添加到了ScrollView:
mScrollViewAroundEt.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (mCustomEditText.hasFocus()) {
mCustomEditText.clearFocus();
}
return false;
}
});
所以现在EditText在用户滚动时不会收到焦点。