2011-03-02 37 views
7

有沒有辦法在我的應用程序中捕獲粘貼事件?當我點擊一個editText並選擇Paste from context菜單時,我必須做點什麼。由於android paste事件

回答

4

創建位置 '粘貼'

註冊的ContextMenu您的EditText menu.xml文件

EditText et=(EditText)findViewById(R.id.et); 
registerForContextMenu(et); 

創建文本菜單

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu);  
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; 
    menu.setHeaderTitle("title"); 
} 

創建方法菜單的onClick

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();  
    switch (item.getItemId()) { 
    case R.id.paste:  
     break;  
    } 
    return true; 
} 
+6

我知道這個線程是老了,但不這樣用自己的上下文菜單替換內置的上下文菜單?如果你喜歡那個菜單,但只想在粘貼發生時收到通知,該怎麼辦? –

+0

@ScottBiggs它也可以在不重新創建菜單的情況下工作。看到我的答案[這裏](http://stackoverflow.com/a/14981376/717341) –

5

您應該在接收粘貼操作的控件上實現一個TextWatcher偵聽器。

TextWatcher類提供了處理任何可編輯的OnChange,BeforeChange和AfterChange的方法。例如:

private void pasteEventHandler() { 
    ((EditText)findViewById(R.id.txtOutput)) 
      .addTextChangedListener(new TextWatcher() { 

       public void afterTextChanged(Editable s) { 
        Log.d(TAG, "Text changed, refreshing view."); 
        refreshView(); 
       } 

       public void beforeTextChanged(CharSequence s, int start, 
         int count, int after) { 
       } 

       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 
       } 
      }); 
} 
+2

只是一個迂腐的評論:鑄造到一個TextView就足夠了。 –

0

下面是代碼,您可以覆蓋動作條複製/粘貼等

public class MainActivity extends Activity { 
    EditText editText; 
    private ClipboardManager myClipboard; 
    private ClipData myClip; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     editText = (EditText) findViewById(R.id.editText3); 

     myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     editText = (EditText) findViewById(R.id.editText3); 
     editText.setCustomSelectionActionModeCallback(new Callback() { 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       // TODO Auto-generated method stub 
       return true; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       // TODO Auto-generated method stub 
       switch (item.getItemId()) { 
       case android.R.id.copy: 
        int min = 0; 
        int max = editText.getText().length(); 
        if (editText.isFocused()) { 
         final int selStart = editText.getSelectionStart(); 
         final int selEnd = editText.getSelectionEnd(); 

         min = Math.max(0, Math.min(selStart, selEnd)); 
         max = Math.max(0, Math.max(selStart, selEnd)); 
        } 
        // Perform your definition lookup with the selected text 
        final CharSequence selectedText = editText.getText() 
          .subSequence(min, max); 
        String text = selectedText.toString(); 

        myClip = ClipData.newPlainText("text", text); 
        myClipboard.setPrimaryClip(myClip); 
        Toast.makeText(getApplicationContext(), "Text Copied", 
          Toast.LENGTH_SHORT).show(); 
        // Finish and close the ActionMode 
        mode.finish(); 
        return true; 
       case android.R.id.cut: 
        // add your custom code to get cut functionality according 
        // to your requirement 
        return true; 
       case android.R.id.paste: 
        // add your custom code to get paste functionality according 
        // to your requirement 
        return true; 

       default: 
        break; 
       } 
       return false; 
      } 
     });   
    }  
} 
0

您可以設置監聽器類:

public interface GoEditTextListener { 
void onUpdate(); 

}

Сreate自我EditText類:

public class GoEditText extends EditText 
{ 
    ArrayList<GoEditTextListener> listeners; 

    public GoEditText(Context context) 
    { 
     super(context); 
     listeners = new ArrayList<>(); 
    } 

    public GoEditText(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     listeners = new ArrayList<>(); 
    } 

    public GoEditText(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     listeners = new ArrayList<>(); 
    } 

    public void addListener(GoEditTextListener listener) { 
     try { 
      listeners.add(listener); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Here you can catch paste, copy and cut events 
    */ 
    @Override 
    public boolean onTextContextMenuItem(int id) { 
     boolean consumed = super.onTextContextMenuItem(id); 
     switch (id){ 
      case android.R.id.cut: 
       onTextCut(); 
       break; 
      case android.R.id.paste: 
       onTextPaste(); 
       break; 
      case android.R.id.copy: 
       onTextCopy(); 
     } 
     return consumed; 
    } 

    public void onTextCut(){ 
    } 

    public void onTextCopy(){ 
    } 

    /** 
    * adding listener for Paste for example 
    */ 
    public void onTextPaste(){ 
     for (GoEditTextListener listener : listeners) { 
      listener.onUpdate(); 
     } 
    } 
} 

XML:

<com.yourname.project.GoEditText 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/editText1"/> 

而在你的活動:

private GoEditText editText1; 

editText1 = (GoEditText) findViewById(R.id.editText1); 

      editText1.addListener(new GoEditTextListener() { 
       @Override 
       public void onUpdate() { 
//here do what you want when text Pasted 
       } 
      });