在EditText中间显示选择

时间:2019-07-15 21:09:03

标签: android android-edittext

我有一个EditText,其可见高度为ca。 20行。 该应用程序将一些文本放入其中,其中包含约100行。 之后,它在此文本中选择一个单词或一个句子。问题是所选的部分显示在底部,但我希望将其显示在EditText的可见区域的中间。

这是现在的样子

enter image description here

但是我想要它

enter image description here

这是我尝试过的:

public void setSelection(final int start, final int end) {
        view.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                chunkBegin = Math.max(0, start - 700);
                chunkEnd = end;

                String text = model.getText().substring(chunkBegin, Math.min(model.getText().length() - 1, chunkEnd + 700));

                view.getTextArea().removeTextChangedListener(textWatcher);
                view.getTextArea().setText(text, TextView.BufferType.EDITABLE);
                view.getTextArea().addTextChangedListener(textWatcher);

                view.getTextArea().requestFocus();
                final int startSel = start - chunkBegin;
                final int endSel = chunkEnd - chunkBegin;
                view.getTextArea().setSelection(startSel, endSel);

                int height = view.getTextArea().getHeight();
                view.getTextArea().scrollTo(0, height / 2);
            }
        });
    }

我认为scrollTo()的调用可以实现,但是仍然看起来像第一个屏幕截图

1 个答案:

答案 0 :(得分:0)

好,我已经完成了。

调用scrollTo()的方法是正确的,但是参数是错误的。我必须确定当前行号及其以像素为单位的y位置。之后,我可以计算出正确的滚动位置。整个过程在最后五行中实现。

下面的最终解决方案是万一有人需要的话:

public void setSelection(final int start, final int end) {
    view.getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            chunkBegin = Math.max(0, start - 700);
            chunkEnd = Math.min(model.getText().length() - 1, end + 700);

            String text = model.getText().substring(chunkBegin, chunkEnd);

            view.getTextArea().removeTextChangedListener(textWatcher);
            view.getTextArea().setText(text, TextView.BufferType.EDITABLE);
            view.getTextArea().addTextChangedListener(textWatcher);

            view.getTextArea().requestFocus();
            final int startSel = Math.min(view.getTextArea().getText().length(), start - chunkBegin);
            final int endSel = Math.min(view.getTextArea().getText().length(), startSel + end - start);

            view.getTextArea().setSelection(startSel, endSel);

            Layout layout = view.getTextArea().getLayout();

            int selectedLine = layout.getLineForOffset(startSel);
            int currentLineTop = view.getTextArea().getLayout().getLineTop(selectedLine);
            int visibleAreaHeight = view.getTextArea().getHeight();
            view.getTextArea().scrollTo(0, currentLineTop - visibleAreaHeight / 2);
        }
    });
}