EditTextでコピー・貼り付けを感知する方法

EditTextコピー貼り付けが行われたことを感知するリスナーを作成する方法をここでは簡単に紹介します。

EditTextの拡張

まずはEditTextを拡張してコピー、貼り付け、切り取りを感知するリスナーをEditText内に作ります。

ここではAdvancedEditTextという名前で次のコードのようにEditTextを拡張します。

import android.content.Context;
import android.util.AttributeSet;
import android.widget.EditText;

/** コピー・貼り付け・切り取りを感知するEditText */
public class AdvancedEditText extends EditText 
{
    public AdvancedEditText(Context context) 
    {
        super(context);
    }

    public AdvancedEditText(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
    }

    public AdvancedEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }
    
    @Override
    public boolean onTextContextMenuItem(int id) 
    {
        switch (id){
            case android.R.id.cut:
                /** コピーされたとき */
                if(menuListener != null) menuListener.onCut();
                break;
            case android.R.id.paste:
                /** 貼り付けされたとき */
                if(menuListener != null) menuListener.onPaste();
                break;
            case android.R.id.copy:
                /** 切り取りされたとき */
                if(menuListener != null) menuListener.onCopy();
                break;
        }
        return super.onTextContextMenuItem(id);
    }
    
    public void setOnContextMenuListener(OnContextMenuListener listener)
    {
        this.menuListener = listener;
    }
    
    /** コピー・貼り付け・切り取りを感知するリスナー */
    public interface OnContextMenuListener
    {
        public void onCopy();
        public void onPaste();
        public void onCut();
    }
}

OnContextMenuListenerというリスナーを作り、onTextContextMenuItemメソッドでコピー・貼り付け・カットが行われたときに適宜それに応じたメソッドを呼び出しています。

また、リスナーを設定するためにsetOnContextMenuListenerというメソッドも作りました。

使用例

使い方は次のように自作したsetOnContextMenuListenerでリスナーを設定するだけです。

public class MainActivity extends Activity
{    
    private final String LOG_TAG = MainActivity.class.getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {

         AdvancedEditText editText = new AdvancedEditTetx(this);
         editText.setOnContextMenuListener(
         new AdvancedEditText.OnContextMenuListener() 
         {   
             @Override
             public void onPaste() 
             {
                 Log.i(LOG_TAG, "貼り付け");
             }
             
             @Override
             public void onCut() 
             {
                 Log.i(LOG_TAG, "切り取り");
             }
             
             @Override
             public void onCopy()
             {
                 Log.i(LOG_TAG, "コピー");
             }
         });
     }
}

EditTextにデフォルトでコピーや切り取りを検知するリスナーがあればよかったのですが、ないのでこのように自作するのが良いと思います。

以上がEditTextのコピーや切り取りを感知するためのリスナーの作り方です。では、また!!

関連項目
プライバシーポリシー