В терминологии могу путаться. В 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() восстанавливал. Так было бы проще и нагляднее.
Комментариев нет:
Отправить комментарий