Reputation: 32273
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
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
Reputation: 7220
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
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
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
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
Reputation: 941
For an EditText
,
in manifest inside the activity use
android:windowSoftInputMode="adjustResize"
Upvotes: -2
Reputation: 1089
To enable the standard copy/paste for TextView, U can choose one of the following:
Change in layout file: add below property to your TextView
android:textIsSelectable="true"
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
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
Reputation: 463
use theme
@android:style/Theme.Black.NoTitleBar.Fullscreen
or
@android:style/Theme.WithActionBar
set TextView in xml
android:textIsSelectable="true"
see result
Upvotes: 5
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
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