Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set up a listener on the selected text in TextView

I am using ActionMode.Callback but I need to know when the text has finished being selected... for example

enter image description here

like image 204
Max Usanin Avatar asked Feb 26 '13 13:02

Max Usanin


2 Answers

in .xml:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

in .class:

textview.setCustomSelectionActionModeCallback(new callback(textview));
...
public class callback implements Callback {

    private TextView mTextView;

    public callback(TextView text) {
        this.mTextView = text;

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        int start = mTextView.getSelectionStart();
        int end = mTextView.getSelectionEnd();
        Spannable wordtoSpan = (Spannable) mTextView.getText();

        switch (item.getItemId()) {

        case R.id.item_blue:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), start
                    , end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.BLUE);
            return true;

        case R.id.item_green:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.GREEN), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.GREEN);
            return true;

        case R.id.item_red:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.RED);
            return true;
        case R.id.item_yellow:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.YELLOW);
            return true;
        case R.id.item_erase:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.TRANSPARENT);
            return true;
        }
        return false;
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.setTitle("Selecione a cor");
        mode.getMenuInflater().inflate(R.menu.menu_text_context, menu);

        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        menu.removeItem(android.R.id.selectAll);
        // Remove the "cut" option
        menu.removeItem(android.R.id.cut);
        // Remove the "copy all" option
        menu.removeItem(android.R.id.copy);
        return true;
    }

}
like image 194
vrbsm Avatar answered Oct 04 '22 09:10

vrbsm


I think you can find your answer here:

Android Text Selection Listener

The key term you're looking for here, to help you with your research, is ActionMode, provided that your target is honeycomb or newer.

The API docs (scroll down to "using the contextual action mode) do an ok job of explaining things, once you find what you're looking for, which is the biggest barrier to their use, but basically what you're going to need to do is this:

  1. set your EditText to be selectable (android:textIsSelectable="true" or setTextIsSelectable(true);
  2. Implement the ActionMode.Callback interface and provide your own menu items.

NOTE: as mentioned above, this only works for API level 11+. If you're targeting earlier platforms, getting the events for text selection is much more complicated.

like image 31
Viktor Apoyan Avatar answered Oct 04 '22 09:10

Viktor Apoyan