开发者

android paste event

开发者 https://www.devze.com 2023-02-14 20:38 出处:网络
Is there a way to catch the paste event in my a开发者_运维百科pplication? I must do something when I click long on an editText and select Paste from context menu. ThanksCreate menu.xml with position \

Is there a way to catch the paste event in my a开发者_运维百科pplication? I must do something when I click long on an editText and select Paste from context menu. Thanks


Create menu.xml with position 'paste'

Register contextMenu to your EditText

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

Create contextMenu

@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");
}

Create method menu onClick

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


You should implement a TextWatcher listener on the control that receives the paste action.

The TextWatcher class provides methods to handle the OnChange, BeforeChange and AfterChange of any Editable. For instance:

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) {
                }
            });
}


Below is code where you can override actionbar copy/Paste etc.

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;
            }
        });         
    }    
}


You can set Listener Class:

public interface GoEditTextListener {
void onUpdate();

}

Сreate self class for 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"/>

And in your activity:

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
                }
            });


You could use this code that I've create recently

        setOnReceiveContentListener(editText, arrayOf("text/*"),
        OnReceiveContentListener { view, payload ->
            if(view == editText && payload.source == ContentInfoCompat.SOURCE_CLIPBOARD && payload.clip.description.hasMimeType("text/*")) {
                var t=""
                for (i in 0 until payload.clip.itemCount) {
                    t += payload.clip.getItemAt(i).text
                }
                //do what ever you want to do with the text and set it to editText
                editText.setText(t)
                return@OnReceiveContentListener null
            } else
                return@OnReceiveContentListener payload
        }
    )

return the payload as it i, if not text and coming from clipboard to avoid any unintended intercepting


Got callback of paste event in onActionItemClicked(mode:ActionMode, item:MenuItem)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        editText.customInsertionActionModeCallback = object : ActionMode.Callback {
            override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
                Log.e("ActionMode", "::ItemClicked")
                if(item?.groupId == android.R.id.paste){
                    Log.e("ActionMode", "::Paste::ItemClicked")
                }
                return true
            }

            override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
                Log.e("ActionMode", "::Created")
                return true
            }

            override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
                Log.e("ActionMode", "::Prepared")
                return true
            }

            override fun onDestroyActionMode(mode: ActionMode?) {
                Log.e("ActionMode", "::Destroyed")
            }

        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消