2013-09-21 3 views
0

У меня есть TextView. Когда он долгое нажатие, фрагмент текста, над которым был сделан длительный щелчок, должен быть выделен и должно появиться контекстное меню действий, которое даст некоторые дополнительные параметры.Переопределение поведения по умолчанию для longClick()

Однако, если текст выделен, контекстное меню действий отличается от того, что требуется. С другой стороны, если отображается меню желаемого контекстного действия, текст не выделяется.

Я смог обнулить его до return в функции onLongClick в onLongClickListener. В частности, если функция onLongClickreturns true (потребляет щелчок), то отображается контекстное меню действий, но поскольку длинный клик никогда не передавался инструменту выбора текста, он не активируется. Однако, если функция onLongClick возвращает false, щелчок переходит к функции, которая вызывает поведение по умолчанию copy + paste текста с выбором.

Код:

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.ActionMode; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

public class HelloTxtView extends Activity { 

    //private EditText ed; 
    private TextView ed; 

    //actionmode callback. 
    private ActionMode mActionMode; 
    private ActionMode.Callback mActionModeCallback; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_hello_txt_view); 

     ed = (TextView) findViewById(R.id.txtview); 
     ed.setFocusable(true); 
     ed.setText("Hello World! Let's select some text!!"); 

     initActionModeCallbacks(); 

     ed.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       Log.v(this.toString(), "Long click."); 
       ed.setCursorVisible(true); 

       Log.v(this.toString(), "Starting actionmodecallback."); 
       mActionMode = HelloTxtView.this.startActionMode(mActionModeCallback); 
       v.setSelected(true); 

       return false; 
      } 
     }); 
    } 

    public void initActionModeCallbacks() { 

     /* 
     * This function initializes the callbacks. 
     */ 

     mActionModeCallback = new ActionMode.Callback() { 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       //nothing to do here. 
       Log.v(this.toString(), "Preparing action mode."); 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       Log.v(this.toString(), "Destroy action mode."); 
       //mActionModeCallback = null; 
      } 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       Log.v(this.toString(), "Creating new action mode menu."); 
       //inflate a new menu. 
       MenuInflater inflater = mode.getMenuInflater(); 
       inflater.inflate(R.menu.options_menu, menu); 
       Log.v(this.toString(), "Done inflating menu."); 
       return true; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       Log.v(this.toString(), "An item was clicked."); 
       switch(item.getItemId()) { 
       case R.id.dictLookup: 
        Log.v(this.toString(), "Look up dictionary."); 
        break; 

       case R.id.readFromHere: 
        Log.v(this.toString(), "Start reading from here:" + ed.getSelectionStart()); 
       } 
       return false; 
      } 
     }; 
    } 
} 

Мой вопрос (ы):
1. Как изменить поведение по умолчанию TextView?
2. Как получить выбор текста с помощью контекстного меню действий?

ответ

1

, если вы хотите получить пользовательский режим контекстных действий по выбору текста, то вы можете сделать somehing как это

ed = (TextView) findViewById(R.id.txtview); 
    ed.setText("Hello World! Let's select some text!!"); 
    initActionModeCallbacks(); 
    ed.setTextIsSelectable(true); 
    ed.setCustomSelectionActionModeCallback(mActionModeCallback); 

    ed.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      Log.v(this.toString(), "Long click."); 
      ed.setCursorVisible(true); 
      v.setSelected(true); 

      return false; 
     } 
    }); 

и в onCreateActionMode (режим ActionMode, меню Menu), если вы хотите удалить стандартные элементы выбора , вы можете позвонить

menu.clear(); 

также отметить, пункты в меню необходимо иметь SHOW_AS_ACTION_ALWAYS флаг, потому что кнопка переполнения не работает причина изменения фокуса https://stackoverflow.com/a/9883763/2751697

Смежные вопросы