Estoy creando una aplicación para Android y quiero copiar el valor de texto de un widget EditText. Es posible que el usuario presione a Menu+A
continuación Menu+C
para copiar el valor, pero ¿cómo iba a hacerlo mediante programación?
Estoy creando una aplicación para Android y quiero copiar el valor de texto de un widget EditText. Es posible que el usuario presione a Menu+A
continuación Menu+C
para copiar el valor, pero ¿cómo iba a hacerlo mediante programación?
Respuestas:
ClipboardManager#setPrimaryClip
Método de uso :
import android.content.ClipboardManager;
// ...
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
import android.content.ClipboardManager;
label
?
Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Entonces, todos están de acuerdo en cómo se debe hacer esto, pero como nadie quiere dar una solución completa, aquí va:
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText("text to clip");
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip");
clipboard.setPrimaryClip(clip);
}
Supongo que tiene algo como lo siguiente declarado en manifiesto:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
label
in newPlainText
? La documentación dice label User-visible label for the clip data.
. Pero cuando es label
visible para el usuario? ¿Y qué tipo de valor / nombre debo poner label
?
Google te lleva a android.content.ClipboardManager y puedes decidir, como lo hice yo, que el Portapapeles no está disponible en API <11, porque la página de documentación dice "Desde: API Nivel 11".
En realidad, hay dos clases, la segunda que extiende la primera: android.text.ClipboardManager y android.content.ClipboardManager.
android.text.ClipboardManager existe desde la API 1, pero solo funciona con contenido de texto.
android.content.ClipboardManager es la forma preferida de trabajar con el portapapeles, pero no está disponible en el nivel API <11 (Honeycomb).
Para obtener cualquiera de ellos, necesita el siguiente código:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
Pero para API <11 tienes que importar android.text.ClipboardManager
y para API> = 11 android.content.ClipboardManager
public void onClick (View v)
{
switch (v.getId())
{
case R.id.ButtonCopy:
copyToClipBoard();
break;
case R.id.ButtonPaste:
pasteFromClipBoard();
break;
default:
Log.d(TAG, "OnClick: Unknown View Received!");
break;
}
}
// Copy EditCopy text to the ClipBoard
private void copyToClipBoard()
{
ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipMan.setPrimaryClip(editCopy.getText());
}
puedes probar esto ...
Aquí hay un código para implementar algunas funciones de copiar y pegar desde EditText (gracias a Warpzit para la verificación de versiones). Puede conectarlos al evento onclick de su botón.
public void copy(View v) {
int startSelection = txtNotes.getSelectionStart();
int endSelection = txtNotes.getSelectionEnd();
if ((txtNotes.getText() != null) && (endSelection > startSelection ))
{
String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection);
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(selectedText);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText);
clipboard.setPrimaryClip(clip);
}
}
}
public void paste(View v) {
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard.getText() != null) {
txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText());
}
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
if (item.getText() != null) {
txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText());
}
}
}
A partir de Android Oreo, la biblioteca de soporte solo se reduce a la API 14. La mayoría de las aplicaciones más nuevas probablemente también tengan una API mínima de 14, y por lo tanto no deben preocuparse por los problemas con la API 11 mencionados en algunas de las otras respuestas. Gran parte del código se puede limpiar. (Pero vea mi historial de edición si aún admite versiones anteriores).
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
Estoy agregando este código como una bonificación, porque copiar / pegar generalmente se realiza en pares.
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
return;
}
android.content.ClipboardManager
versión en lugar de la anterior android.text.ClipboardManager
. Lo mismo para ClipData
.context.getSystemService()
.null
. Puede verificar cada uno si lo encuentra más legible.Para habilitar el copiar / pegar estándar para TextView, U puede elegir uno de los siguientes:
Cambio en el archivo de diseño: agregue la propiedad siguiente a su TextView
android:textIsSelectable="true"
En su clase de Java, escriba esta línea dos, establezca la gramática.
myTextView.setTextIsSelectable(true);
Y mantenga presionado el TextView para ver la barra de acción copiar / pegar.
@FlySwat ya dio la respuesta correcta, solo estoy compartiendo la respuesta completa:
Utilice el método ClipboardManager.setPrimaryClip ( http://developer.android.com/reference/android/content/ClipboardManager.html ):
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Donde label
hay una etiqueta visible para el usuario para los datos del clip y
text
es el texto real en el clip. Según los documentos oficiales .
Es importante usar esta importación:
import android.content.ClipboardManager;
Aquí está mi código de trabajo
/**
* Method to code text in clip board
*
* @param context context
* @param text text what wan to copy in clipboard
* @param label label what want to copied
*/
public static void copyCodeInClipBoard(Context context, String text, String label) {
if (context != null) {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(label, text);
if (clipboard == null || clip == null)
return;
clipboard.setPrimaryClip(clip);
}
}
Para Kotlin, podemos usar el siguiente método. Puede pegar este método dentro de una actividad o fragmento.
fun copyToClipBoard(context: Context, message: String) {
val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label",message)
clipBoard.setPrimaryClip(clipData)
}
context.
era la parte que faltaba - podría ser porque lo estoy haciendo dentro de un fragmento.