我有一个EditText,其可见高度为ca。 20行。 该应用程序将一些文本放入其中,其中包含约100行。 之后,它在此文本中选择一个单词或一个句子。问题是所选的部分显示在底部,但我希望将其显示在EditText的可见区域的中间。
这是现在的样子
但是我想要它
这是我尝试过的:
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()
的调用可以实现,但是仍然看起来像第一个屏幕截图
答案 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);
}
});
}