Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Как восстановить выделение текста в EditText после выхода из ActionMode

В терминологии могу путаться. В Android совсем недавно. Создаю обычный проект с BlankActivity.
activity_main.xml



MainActivity.java
package pro1c.net.testactionmode;
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem;
public class MainActivity extends AppCompatActivity{
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
Запускаю на выполнение. Выделяю текст и выхожу из ActionMode.

Выделение пропадает. Курсор устанавливается туда где раньше был конец выделения.

Вопрос: Как сохранить выделение после выхода из ActionMode?
Я попробовал решить так:
Создал SelectionEditText.java (Был найден тут https://eyes-free.googlecode.com/svn/trunk/ime/latinime/src/com/googlecode/eyesfree/inputmethod/latin/tutorial/SelectionEditText.java) Он позволяет поймать событие изменения выделения текста.
SelectionEditText.java
package pro1c.net.testactionmode;
import android.content.Context; import android.util.AttributeSet; import android.widget.EditText;
public class SelectionEditText extends EditText { private SelectionListener mSelectionListener = null;
private int mOldSelStart = 0; private int mOldSelEnd = 0;
public SelectionEditText(Context context) { super(context); }
public SelectionEditText(Context context, AttributeSet attrs) { super(context, attrs); }
public SelectionEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
public void setSelectionListener(SelectionListener selectionListener) { mSelectionListener = selectionListener; }
@Override protected void onSelectionChanged(int selStart, int selEnd) { super.onSelectionChanged(selStart, selEnd);
if (mSelectionListener != null) { mSelectionListener.onSelectionChanged(this, mOldSelStart, mOldSelEnd, selStart, selEnd); }
mOldSelStart = selStart; mOldSelEnd = selEnd; }
public static interface SelectionListener { public void onSelectionChanged(SelectionEditText editText, int oldSelStart, int oldSelEnd, int selStart, int selEnd); } }
activity_main.xml Немного подправляю чтобы он использовал класс SelectionEditText



MainActivity.java Имплементирую ActionMode.Callback и SelectionEditText.SelectionListener При завершении ActionMode устанавливаю локальную переменную destroyActionMode в true. А дальше когда происходит попытка изменить выделение текста, проверяю эту переменную, и возвращаю выделение обратно на старые позиции.
package pro1c.net.testactionmode;
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem;
public class MainActivity extends AppCompatActivity implements ActionMode.Callback,SelectionEditText.SelectionListener{
SelectionEditText editText; private boolean destroyActionMode;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (SelectionEditText) findViewById(R.id.editText); editText.setCustomSelectionActionModeCallback(this); editText.setSelectionListener(this); }
@Override public void onDestroyActionMode(ActionMode mode) { destroyActionMode = true; }
@Override public void onSelectionChanged(SelectionEditText editText, int oldSelStart, int oldSelEnd, int selStart, int selEnd) { if (destroyActionMode){ editText.setSelection(oldSelStart,oldSelEnd); destroyActionMode = false; } }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }
@Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return true; }
@Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; }
@Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return true; } }
Правильно ли я сделал? Что-то подсказывает мне, что решение не совсем изящное. Есть ли другой способ сохранить выделение текста после отключения ActionMode?


Ответ

Как я понимаю, это стандартный use case, когда после выхода из action mode выделение сбрасывается, так задумано. Если по какой-то причине это надо обойти, я бы просто использовал свой ActionMode.Callback, где в onCreateActionMode() сохранял состояние выделения, а в onDestroyActionMode() восстанавливал. Так было бы проще и нагляднее.

Комментариев нет:

Отправить комментарий