ixx
ixx

Reputation: 32273

How do I enable standard copy paste for a TextView in Android?

I want to enable standard copy paste for a TextView (the same as for EditText). How can I do it?

I tried using a non-editable EditText but it didn't work well (sometimes it became editable or the copy paste overlay was not shown). And it's probably not a good approach generally.

Need a working solution starting at API 7.

Upvotes: 159

Views: 118706

Answers (12)

Anand Nishad
Anand Nishad

Reputation: 126

To enable text selection, you need to set the 
textIsSelectable attribute to true( android:textIsSelectable="true") in the XML.

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"/>

Upvotes: 0

Sana Ebadi
Sana Ebadi

Reputation: 7220

  1. you have to set FullScreen theme on your activity or fragment first of all!

@

Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        requireActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

and in layout.xml in textview add:

    android:textIsSelectable="true"

Done!

Upvotes: -1

DiLDoST
DiLDoST

Reputation: 372

Here is how you can enable the Standard Copy/Paste:

TextView class has a definition:

boolean canPaste() {
    return (mText instanceof Editable
            && mEditor != null && mEditor.mKeyListener != null
            && getSelectionStart() >= 0
            && getSelectionEnd() >= 0
            && getClipboardManagerForUser().hasPrimaryClip());
}

Which can be bypassed using:

public static void enableCopyPaste(final TextView tv) {
    if(tv.getKeyListener()==null){
        tv.setKeyListener(new KeyListener(){

                @Override
                public void clearMetaKeyState(View p1, Editable p2, int p3) {
                    // unused
                }

                @Override
                public int getInputType() {
                    return tv.getInputType();
                }

                @Override
                public boolean onKeyDown(View p1, Editable p2, int p3, KeyEvent p4) {
                    // unused
                    return false;
                }

                @Override
                public boolean onKeyOther(View p1, Editable p2, KeyEvent p3) {
                    // unused
                    return false;
                }

                @Override
                public boolean onKeyUp(View p1, Editable p2, int p3, KeyEvent p4) {
                    // unused
                    return false;
                }
            });
    }

    tv.setTextIsSelectable(true);
    CharSequence mText = tv.getText();
    if(!(mText instanceof Editable)){
        tv.setText(mText,TextView.BufferType.EDITABLE);
    }
}

By calling:

enableCopyPaste(YOUR_TEXTVIEW);

Ps: It also enables Cut, Share etc

Upvotes: 1

narcis dpr
narcis dpr

Reputation: 1135

if someone wants to go the extra mile and do the select and copy to the clipboard with one click :

 phone.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                            clipboard.setPrimaryClip(clip);

                        }
                    });

phone is the TextView and phone.Text is the Text that will be copied to the clipboard.

Upvotes: 3

Agilarasan anbu
Agilarasan anbu

Reputation: 2805

In xml textview paste this code

android:textIsSelectable="true"

Then in java file,

 final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
    txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
        @Override
        public void onClick(View view) {
            ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
            cm.setText(txtcopypaste.getText().toString());              
            Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
        }
    });

Requirement : Need to copy and paste the text which is in the textview.

OutCome : Using textview , once i clicked the textview. Its automatically copied the text which is in the textview.

Note: While importing clipboardmanager try to prefer

Please prefer text clipboard manager

import android.text.ClipboardManager; // prefer this 

try to avoid content clipboard manager

import android.content.ClipboardManager; // Not this

Upvotes: 16

CommonsWare
CommonsWare

Reputation: 1006869

Try android:textIsSelectable.

i.e., android:textIsSelectable="true"

Upvotes: 291

rajeesh
rajeesh

Reputation: 941

For an EditText, in manifest inside the activity use android:windowSoftInputMode="adjustResize"

Upvotes: -2

RamiReddy
RamiReddy

Reputation: 1089

To enable the standard copy/paste for TextView, U can choose one of the following:

  1. Change in layout file: add below property to your TextView

    android:textIsSelectable="true"

  2. In your Java class write this line to set it programmatically. myTextView.setTextIsSelectable(true);

And long press on the TextView you can see copy/paste action bar.

Upvotes: 68

Beeing Jk
Beeing Jk

Reputation: 3926

this is better:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}

Upvotes: -1

Michael Mao
Michael Mao

Reputation: 463

  1. use theme

    @android:style/Theme.Black.NoTitleBar.Fullscreen
    

    or

    @android:style/Theme.WithActionBar
    
  2. set TextView in xml

    android:textIsSelectable="true"
    
  3. see result

Upvotes: 5

AZ_
AZ_

Reputation: 21899

Requires API 11, Updated Code, previous method is deprecated

Solution for theme full screen without ActionBar

Extend TextView and in constructor paste following code

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });

Upvotes: 12

ixx
ixx

Reputation: 32273

This works for copy pre-Honeycomb:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});

Upvotes: 28

Related Questions