Bir TextView'da metin seçin + kopyala?


106

Kullanıcının bir TextView'da metin seçmesine / kopyalamasına izin vermenin bir yolu var mı? Kontrole uzun süre basabileceğiniz ve tümünü seç / kopyala açılır seçeneklerini alabileceğiniz aynı EditText işlevselliğine ihtiyacım var, ancak bir TextView gibi görünmek için kontrole ihtiyacım var.

EditText yapmak gibi birkaç şeyi, editable = "none" seçeneğini veya inputType = "none" kullanmayı denedim, ancak bunlar hala bir EditText'in çerçeveli arka planını koruyor, ki bunu istemiyorum,

Teşekkürler

------- Güncelleme ----------------------

Bu% 99 orada, tek istediğim seçim tepesinin görünür olması (turuncu şeyler). Bunun dışında iyi, bununla yaşayabilir:

<EditText 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:editable="false"
  style="?android:attr/textViewStyle"
  android:textColor="@color/white"
  android:textAppearance="@android:style/TextAppearance.Medium"
  android:cursorVisible="false"
  android:background="@null" />

Sanırım cursorVisible = "false" nedeniyle oluşuyor, ancak bu olmadan imleç herhangi bir seçim yapılmadan bile mevcut.


Metni görüntülemek için bir TextView yerine WebView kullanmak bir alternatif olabilir.
aleb


Yanıtlar:


221

android: textIsSelectable çalışır (en azından ICS'de - önceki sürümleri henüz kontrol etmedim)

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />

15
Yalnızca API Seviye 11 ve üstü
Thierry-Dimitri Roy

10
Ama nasıl kopyalanır? Metni vurgulayabilirim, ancak kopya menüsü görünmedi.
Bagusflyer

1
Bu, imleçlerle oynadığınızda kazaya neden olmaz mı?
Shubham

1
listview'da nasıl çalıştırılacağını bana bildirir misin?
Ramesh Kumar


56

Metin Görünümünün etkinleştirilmesi, odaklanabilir, longClickable ve textIsSelectable olması gerekir

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:id="@+id/pwTextView"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" />

1
Bu en iyi çözüm.
Cesur

9
Neden textIsSelectableyeterli değil? sadece bu seçenekle benim için çalışıyor
herau

4
Ya da textview.setTextIsSelectable(true)java kodunda kullanabilirsiniz.
berrytchaks

1
Sadece textIsSelectableisbenim için iş yap
crgarridos

1
bir şekilde, textIsSelectablebazı durumlarda işe yarıyor, ancak diğerleri için değil. Bazen, aynı düzen her zaman yalnızca textIsSelectable ile değil, farklı bir metinle çalışır. Ancak, bu çözüm daha iyi çalışmasını sağlamıyor gibi görünüyor, bu nedenle sorun başka bir yerden geliyor olabilir.
Simon Ninon

23

Sanırım daha iyi bir çözümüm var. Sadece ara
registerForContextMenu(yourTextView);

ve TextViewiçerik menüsü olaylarını almak için kaydedileceksiniz.

Sonra geçersiz onCreateContextMenuiçinde seninActivity

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    //user has long pressed your TextView
    menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy");

    //cast the received View to TextView so that you can get its text
    TextView yourTextView = (TextView) v;

    //place your TextView's text in clipboard
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText(yourTextView.getText());
}

Umarım bu, size ve bir sayfadaki metni kopyalamanın bir yolunu arayanlara yardımcı olur. TextView


Bu, kullanıcının hangi metin bitlerinin kopyalanacağını seçmesine izin verir? Asıl soru olmayan her şeyi kopyalamıyor mu?
James Moore

4
Muhtemelen bunun, menüden "Kopyala" yı seçip seçmemelerine bakılmaksızın metnin hemen kopyalanmasına neden olduğunu unutmamak gerekir. Yalnızca uygun öğe seçildiğinde kopyalamak için onContextItemSelected () öğesini de geçersiz kılmanız veya menü öğesine bir tıklama işleyicisi eklemeniz gerekir.
Faisal

ClipboardManager.setText(CharSequence text)11. API düzeyinde kullanımdan kaldırılmıştır. setPrimaryClip(ClipData)Bunun yerine kullanın . Bu, verilen metni tutan bir ClippedItem oluşturur ve onu birincil klip olarak ayarlar. Etiketi veya ikonu yoktur. Kopyala-yapıştır hakkında iyi okuma: bağlantı
Marilia

Metin seçiminden sonra iletişim kutusunu açmak istiyorum. Öyleyse bunun için herhangi bir öneride bulunabilir misiniz?
Anand Savjani

9
textview1.setTextIsSelectable(true);

Bu, kullanıcının uzun tıklamayla veya genellikle yaptığımız gibi metni seçmesine ve kopyalamasına olanak tanır.


6

Ben de aynısını uygulamaya çalışıyorum ve sorunuz editext düzenimi doğru şekilde ayarlamama yardımcı oldu. Çok teşekkürler! :)

Sonra, imleç açıksa vurgunun gerçekten görüneceğini fark ettim. Ancak, metne uzun süre tıklamadan önce bir imleci görmek istemediğinizi beğeniyorum, bu yüzden imleci sizin gibi layout.xml dosyasında gizledim ve uzun tıklama için bir olay dinleyici ekledim ve imleci yalnızca bir seçim başladığında gösteriyorum .

Dinleyiciyi onCreate bölümünde Aktivitenize ekleyin:

public TextView htmltextview;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    htmltextview.setOnLongClickListener(new OnLongClickListener(){

        public boolean onLongClick(View v) {
            htmltextview.setCursorVisible(true);
            return false;
        }
    });

}

Ve voilá, başında imleç yok ve uzun tıklarsanız, imleç seçim sınırları ile birlikte görünür.

Umarım yardımcı olabilmişimdir.

Şerefe, fm


5

Ben de benzer bir şey yapmaya çalışıyordum, ancak yine de TextView'da metnin vurgulanmasıyla ilgili özel bir yaklaşıma ihtiyacım vardı. Eylemde vurgulama ve kopyalamayı tetikledim LongClick.

Şunu kullanmayı başardım SpannableString:

SpannableString highlightString = new SpannableString(textView.getText());
highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(getActivity(), R.color.gray))
            , 0, textView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(highlightString);
copyToClipboard(urlToShare);

ve kopyalama işlevi:

public void copyToClipboard(String copyText) {
    ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("url", copyText);
    clipboard.setPrimaryClip(clip);
    Toast toast = Toast.makeText(getActivity(), "Link is copied", Toast.LENGTH_SHORT);
    toast.show();
}

Umarım bu soruya cevap veren biri için yararlıdır :)


4

Kotlin'i Programlı Olarak Kullanma (Manuel Kopya)

button.setTextIsSelectable(true)

Veya bir Kotlin mülk uzantısı ekleyin

var TextView.selectable
    get() = isTextSelectable
    set(value) = setTextIsSelectable(value)

Sonra ara

textview.selectable = true
// or
if (textview.selectable) { ...

Kotlin'i Programlı Olarak Kullanma (Otomatik Kopyalama)

Kullanıcı görüntülediğiniz uzun bastığında otomatik olarak kopyalamak istiyorsanız, bu gerekli temel koddur:

myView.setOnLongClickListener {  
    val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("Copied String", myString)
    clipboardManager.setPrimaryClip(clip)
    true // Or false if not consumed
}

ToastOlduğunu onaylamak için bir eklemek isteyebilirsiniz

Veya bir Kotlin uzantı işlevi ekleyin

myView.copyOnHold() // pass custom string to not use view contents

fun TextView.copyOnHold(customText: String? = null) {
    setOnLongClickListener {
        val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
        val clip = ClipData.newPlainText("Copied String", customText ?: text)
        clipboardManager.setPrimaryClip(clip)
        true // Or false if not consumed
    }
}

Xml (Manuel Kopyalama) Kullanma

Bunu seninkine ekle <TextView>

android:textIsSelectable="true"

NOT: Bunların tümü, android:enabled="true"ve android:focusable="true", a için varsayılan değerler olan gerektirir TextView.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.