163

Может кто-нибудь, пожалуйста, скажите мне, как скопировать текст, присутствующий в определенном текстовом виде, в буфер обмена при нажатии кнопки? Thanx :)Как скопировать текст в клип-панель на Android?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainpage); 
    textView = (TextView) findViewById(R.id.textview); 
    copyText = (Button) findViewById(R.id.bCopy); 
    copyText.setOnClickListener(new View.OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
      String getstring = textView.getText().toString(); 

      //Help to continue :) 





     } 
    }); 
} 

}

Я хочу, чтобы скопировать текст в TextView TextView в буфер обмена при нажатии кнопки bCopy! Пожалуйста помощь ...

+0

Возможный дубликат [Как скопировать текст программно в моей Android приложений?] (Http://stackoverflow.com/questions/238284/how-to-copy-text-programmatically-in-my-android -app) –

+0

https://stackoverflow.com/q/48791271/9274175 Ответьте на эти вопросы по поводу coppy –

ответ

290

использование ClipboardManager

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText(label, text); 
clipboard.setPrimaryClip(clip); 

убедитесь, что вы импортировали android.content.ClipboardManager и НЕ android.text.ClipboardManager. Последнее устарело. Для получения дополнительной информации см. Это link.

+3

Это для API11 +, но не работает для GB и ниже – Javier

+0

@zen Я думаю, вы можете использовать «setText» для GB. –

+0

import 'android.content.ClipboardManager' и *** not ***' android.text.ClipboardManager' (я получил '' android.text.ClipboardManager 'is derecated' warning) – Atul

53

Вчера я сделал этот класс. Возьми его, это для всех Уровней API

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import android.annotation.SuppressLint; 
import android.content.ClipData; 
import android.content.ClipboardManager; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.AssetFileDescriptor; 
import android.net.Uri; 
import android.util.Log; 
import de.lochmann.nsafirewall.R; 

public class MyClipboardManager { 

    @SuppressLint("NewApi") 
    @SuppressWarnings("deprecation") 
    public boolean copyToClipboard(Context context, String text) { 
     try { 
      int sdk = android.os.Build.VERSION.SDK_INT; 
      if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { 
       android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context 
         .getSystemService(context.CLIPBOARD_SERVICE); 
       clipboard.setText(text); 
      } else { 
       android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context 
         .getSystemService(context.CLIPBOARD_SERVICE); 
       android.content.ClipData clip = android.content.ClipData 
         .newPlainText(
           context.getResources().getString(
             R.string.message), text); 
       clipboard.setPrimaryClip(clip); 
      } 
      return true; 
     } catch (Exception e) { 
      return false; 
     } 
    } 

    @SuppressLint("NewApi") 
    public String readFromClipboard(Context context) { 
     int sdk = android.os.Build.VERSION.SDK_INT; 
     if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { 
      android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context 
        .getSystemService(context.CLIPBOARD_SERVICE); 
      return clipboard.getText().toString(); 
     } else { 
      ClipboardManager clipboard = (ClipboardManager) context 
        .getSystemService(Context.CLIPBOARD_SERVICE); 

      // Gets a content resolver instance 
      ContentResolver cr = context.getContentResolver(); 

      // Gets the clipboard data from the clipboard 
      ClipData clip = clipboard.getPrimaryClip(); 
      if (clip != null) { 

       String text = null; 
       String title = null; 

       // Gets the first item from the clipboard data 
       ClipData.Item item = clip.getItemAt(0); 

       // Tries to get the item's contents as a URI pointing to a note 
       Uri uri = item.getUri(); 

       // If the contents of the clipboard wasn't a reference to a 
       // note, then 
       // this converts whatever it is to text. 
       if (text == null) { 
        text = coerceToText(context, item).toString(); 
       } 

       return text; 
      } 
     } 
     return ""; 
    } 

    @SuppressLint("NewApi") 
    public CharSequence coerceToText(Context context, ClipData.Item item) { 
     // If this Item has an explicit textual value, simply return that. 
     CharSequence text = item.getText(); 
     if (text != null) { 
      return text; 
     } 

     // If this Item has a URI value, try using that. 
     Uri uri = item.getUri(); 
     if (uri != null) { 

      // First see if the URI can be opened as a plain text stream 
      // (of any sub-type). If so, this is the best textual 
      // representation for it. 
      FileInputStream stream = null; 
      try { 
       // Ask for a stream of the desired type. 
       AssetFileDescriptor descr = context.getContentResolver() 
         .openTypedAssetFileDescriptor(uri, "text/*", null); 
       stream = descr.createInputStream(); 
       InputStreamReader reader = new InputStreamReader(stream, 
         "UTF-8"); 

       // Got it... copy the stream into a local string and return it. 
       StringBuilder builder = new StringBuilder(128); 
       char[] buffer = new char[8192]; 
       int len; 
       while ((len = reader.read(buffer)) > 0) { 
        builder.append(buffer, 0, len); 
       } 
       return builder.toString(); 

      } catch (FileNotFoundException e) { 
       // Unable to open content URI as text... not really an 
       // error, just something to ignore. 

      } catch (IOException e) { 
       // Something bad has happened. 
       Log.w("ClippedData", "Failure loading text", e); 
       return e.toString(); 

      } finally { 
       if (stream != null) { 
        try { 
         stream.close(); 
        } catch (IOException e) { 
        } 
       } 
      } 

      // If we couldn't open the URI as a stream, then the URI itself 
      // probably serves fairly well as a textual representation. 
      return uri.toString(); 
     } 

     // Finally, if all we have is an Intent, then we can just turn that 
     // into text. Not the most user-friendly thing, but it's something. 
     Intent intent = item.getIntent(); 
     if (intent != null) { 
      return intent.toUri(Intent.URI_INTENT_SCHEME); 
     } 

     // Shouldn't get here, but just in case... 
     return ""; 
    } 

} 
+0

Можете ли вы добавить необходимые операторы импорта, чтобы этот класс работал? – merlin2011

+0

@ merlin2011 сделал это, думаю, я забыл метод coerceToText (...). Sry для этого –

+0

Что делает «coerceToText»? Кроме того, возможно ли копировать/вставлять другие типы данных в буфер обмена (например: растровое изображение)? –

10

Просто используйте это. Он работает только для android api> = 11, прежде чем вам придется использовать ClipData.

ClipboardManager _clipboard = (ClipboardManager) _activity.getSystemService(Context.CLIPBOARD_SERVICE); 
_clipboard.setText(YOUR TEXT); 

Надеется, что это помогло вам :)

[UPDATE 3/19/2015] Так же, как Ujjwal Singh сказал, что метод setText является устаревшим теперь, вы должны использовать, так же, как документы recommandé его, setPrimaryClip(clipData)

+0

Показывает ошибку _активность не может быть решена. –

+1

Какая ошибка в точности? Можете ли вы опубликовать его? – Ektos974

+0

«_активность не может быть решена» –

6
@SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" }) 
@SuppressWarnings("deprecation") 
@TargetApi(11) 
public void onClickCopy(View v) { // User-defined onClick Listener 
    int sdk_Version = android.os.Build.VERSION.SDK_INT; 
    if(sdk_Version < android.os.Build.VERSION_CODES.HONEYCOMB) { 
     android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
     clipboard.setText(textView.getText().toString()); // Assuming that you are copying the text from a TextView 
     Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show(); 
    } 
    else { 
     android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
     android.content.ClipData clip = android.content.ClipData.newPlainText("Text Label", textView.getText().toString()); 
     clipboard.setPrimaryClip(clip); 
     Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show(); 
    } 
} 
41

Здесь метод, чтобы скопировать текст в буфер обмена:

private void setClipboard(Context context, String text) { 
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { 
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
    clipboard.setText(text); 
    } else { 
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); 
    clipboard.setPrimaryClip(clip); 
    } 
} 

Этот метод работает на всех устройствах Android.

+1

Я не понимаю, что означает« контекст ». Можете ли вы добавить пример правильного вызова этого метода? Благодарю. –

+1

Также похоже, что значение «контекст» не используется. Итак, почему он должен быть передан как параметр? –

+0

@E_Blue спасибо за ответ, сейчас я редактирую – vuhung3990

5

использовать этот код

private ClipboardManager myClipboard; 
    private ClipData myClip; 
    TextView textView; 
    Button copyText; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainpage); 
    textView = (TextView) findViewById(R.id.textview); 
    copyText = (Button) findViewById(R.id.bCopy); 
    myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); 

    copyText.setOnClickListener(new View.OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      String text = textView.getText().toString(); 
      myClip = ClipData.newPlainText("text", text); 
      myClipboard.setPrimaryClip(myClip); 
      Toast.makeText(getApplicationContext(), "Text Copied", 
      Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
+0

Большое спасибо, его очень просто использовать. – kdblue

5

использовать эту функцию для копирования в буфер обмена

public void copyToClipboard(String copyText) { 
    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(copyText); 
    } else { 
     android.content.ClipboardManager clipboard = (android.content.ClipboardManager) 
       getSystemService(Context.CLIPBOARD_SERVICE); 
     android.content.ClipData clip = android.content.ClipData 
       .newPlainText("Your OTP", copyText); 
     clipboard.setPrimaryClip(clip); 
    } 
    Toast toast = Toast.makeText(getApplicationContext(), 
      "Your OTP is copied", Toast.LENGTH_SHORT); 
    toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 50, 50); 
    toast.show(); 
    //displayAlert("Your OTP is copied"); 
} 
+0

Это работает для меня. Очень просто и чисто, спасибо –

0

INT = android.os.Build.VERSION.SDK_INT SDK;

if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { 
     android.text.ClipboardManager clipboard = (android.text.ClipboardManager) DetailView.this 
       .getSystemService(Context.CLIPBOARD_SERVICE); 
     clipboard.setText("" + yourMessage.toString()); 
     Toast.makeText(AppCstVar.getAppContext(), 
       "" + getResources().getString(R.string.txt_copiedtoclipboard), 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     android.content.ClipboardManager clipboard = (android.content.ClipboardManager) DetailView.this 
       .getSystemService(Context.CLIPBOARD_SERVICE); 
     android.content.ClipData clip = android.content.ClipData 
       .newPlainText("message", "" + yourMessage.toString()); 
     clipboard.setPrimaryClip(clip); 
     Toast.makeText(AppCstVar.getAppContext(), 
       "" + getResources().getString(R.string.txt_copiedtoclipboard), 
       Toast.LENGTH_SHORT).show(); 
    }