1

更具体地说,我已经做了这种行为的小例子。

布局:

  <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 链接

4

1 回答 1

0

我找到了一些解决方案。问题在于 EditText 在执行setSpan方法后获得了焦点。所以我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 在用户滚动时不会收到焦点。

于 2013-09-06T09:09:24.783 回答