EditText:允许滚动但禁用选择

时间:2016-04-06 13:33:35

标签: android android-layout scroll android-edittext textselection

我正在尝试创建一个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的问题,其中没有文本可以选择,但用户仍然可以滚动?

编辑:用户仍然可以更改光标位置。

2 个答案:

答案 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;
    }
});
}