将span添加到文本会导致在EditText内滚动到光标位置

时间:2013-09-03 10:13:28

标签: android android-edittext scrollview html

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

布局:

  <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获取此示例的完整代码。

1 个答案:

答案 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在用户滚动时不会收到焦点。