TextView में टेक्स्ट का चयन करें?


106

क्या उपयोगकर्ता को TextView में पाठ का चयन / कॉपी करने की अनुमति देने का कोई तरीका है? मुझे EditText की समान कार्यक्षमता की आवश्यकता है जहाँ आप नियंत्रण को लंबे समय तक दबा सकते हैं और चुनिंदा सभी / कॉपी के पॉपअप विकल्प प्राप्त कर सकते हैं, लेकिन मुझे TextView की तरह दिखने के लिए नियंत्रण की आवश्यकता है।

कुछ चीजों को बनाने की कोशिश की, जैसे कि EditText का उपयोग करना संपादन योग्य = "कोई नहीं" विकल्प या इनपुट टाइप = "कोई नहीं", लेकिन फिर भी वे एक EditText की फ़्रेम की गई पृष्ठभूमि को बरकरार रखते हैं, जिसे मैं नहीं चाहता,

धन्यवाद

------- अपडेट करें ----------------------

यह वहाँ 99% है, मैं चाहता हूँ कि चयन hilight के लिए दृश्यमान (नारंगी सामान) है। इसके अलावा यह अच्छा है, हालांकि इस के साथ रह सकता है:

<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" />

मुझे लगता है कि यह कर्सर के कारण हो रहा है अदृश्य = "झूठा" लेकिन इसके बावजूद कि कर्सर बिना किसी चयन के भी मौजूद है।


पाठ प्रदर्शित करने के लिए TextView के बजाय WebView का उपयोग करना एक विकल्प होगा।
अलेब


जवाबों:


221

Android: textIsSelectable works (कम से कम ICS में - मैंने अभी तक पुराने संस्करणों में जाँच नहीं की है)

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

15
एपीआई स्तर 11 और केवल ऊपर
थियरी-दिमित्री रॉय

10
लेकिन नकल कैसे करें? मैं पाठ को हाइलाइट कर सकता हूं, लेकिन कोई प्रतिलिपि मेनू दिखाई नहीं दिया।
Bagusflyer

1
यह दुर्घटना का कारण नहीं है, जब आप शाप देने वालों के साथ फ़िदा होते हैं।
शुभम

1
क्या आप मुझे बता सकते हैं कि इसे सूची में कैसे काम करना है?
रमेश कुमार

टूलबार पर बनाई गई सुंदर, यहां तक ​​कि डिफ़ॉल्ट कॉपी मेनू
फरीद

56

पाठ दृश्य को सक्षम, फ़ोकस करने योग्य, लंबी क्लिक करने योग्य और textIsSelectable होना चाहिए

<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
यह सबसे अच्छा उपाय है।
बहादुर

9
क्यों textIsSelectableपर्याप्त नहीं है? यह मेरे लिए केवल इस विकल्प के साथ काम करता है
हेरू

4
या आप textview.setTextIsSelectable(true)कोड जावा कोड में उपयोग कर सकते हैं ।
बेरीचैक्स

1
बस textIsSelectableisमेरे लिए काम कर
crgarridos

1
किसी तरह, textIsSelectableकुछ मामलों के लिए काम करता है, लेकिन दूसरों को नहीं। कभी-कभी, एक ही लेआउट हमेशा केवल textIsSelectable लेकिन एक अलग पाठ के साथ काम नहीं करता है। हालाँकि, यह समाधान बेहतर काम नहीं करता है, इसलिए यह मुद्दा कहीं और से आ रहा है।
शमौन निऑन

23

मुझे लगता है कि मेरे पास एक बेहतर उपाय है। बस कॉल करना
registerForContextMenu(yourTextView);

और आपका TextViewसंदर्भ मेनू कार्यक्रम प्राप्त करने के लिए पंजीकृत किया जाएगा।

फिर onCreateContextMenuअपने में ओवरराइड करेंActivity

@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());
}

आशा है कि यह आपको और किसी और को पाठ की प्रतिलिपि बनाने का तरीका ढूंढने में मदद करता है TextView


यह उपयोगकर्ता को यह चुनने की अनुमति देता है कि पाठ के कौन से बिट्स कॉपी किए गए हैं? क्या यह सब कुछ कॉपी नहीं करता है, जो मूल प्रश्न नहीं है?
जेम्स मूर

4
शायद यह नोट करना अच्छा है कि यह पाठ को कॉपी करने का कारण बनता है, भले ही वे मेनू से "कॉपी" का चयन करें या नहीं। केवल जब उपयुक्त आइटम का चयन किया गया था, तो आपको कॉपी करने के लिए, आपको ऑन-कॉन्टेक्स्ट इटसेलेक्टेड () को भी ओवरराइड करना होगा, या मेनू आइटम पर एक क्लिक हैंडलर जोड़ना होगा।
फैसल

ClipboardManager.setText(CharSequence text)एपीआई स्तर 11 में पदावनत किया गया था setPrimaryClip(ClipData)। इसके बजाय उपयोग करें । यह दिए गए पाठ को पकड़े हुए एक ClippedItem बनाता है और इसे प्राथमिक क्लिप के रूप में सेट करता है। इसका कोई लेबल या आइकन नहीं है। कॉपी-पेस्ट के बारे में अच्छा पढ़ना: लिंक
मेरिलिया

मैं पाठ चयन के बाद संवाद खोलना चाहता हूं। तो क्या आप इसके लिए कोई सुझाव दे सकते हैं?
आनंद सवजानी

9
textview1.setTextIsSelectable(true);

यह उपयोगकर्ता को लंबे क्लिक पर या जैसा कि हम आमतौर पर करते हैं, पाठ का चयन करने और कॉपी करने में सक्षम करेगा


6

मैं उसी को लागू करने की कोशिश कर रहा हूं, और आपके प्रश्न ने मुझे अपना एडिटेक्स लेआउट सही ढंग से सेट करने में मदद की। तो धन्यवाद! :)

तब मुझे एहसास हुआ, कि यदि कर्सर चालू है तो वास्तव में हाइलाइट दिखाई देगा। लेकिन मुझे पसंद है कि आप टेक्स्ट पर क्लिक करने से पहले एक कर्सर नहीं देखना चाहते हैं, इसलिए मैं आपके जैसे ही लेआउट में कर्सर छिपाता हूँ। ।

तो onCreate अनुभाग में अपनी गतिविधि में श्रोता को जोड़ें:

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;
        }
    });

}

और वॉयला, शुरुआत में कोई कर्सर नहीं है, और यदि आप लंबे समय तक क्लिक करते हैं, तो कर्सर चयन सीमाओं के साथ दिखाई देता है।

मुझे उम्मीद है कि मैं मदद कर सकता हूं।

चीयर्स, एफ.एम.


5

मैं भी कुछ ऐसा ही करने की कोशिश कर रहा था, लेकिन फिर भी TextView में टेक्स्ट को हाइलाइट करने के हेरफेर के साथ कस्टम दृष्टिकोण की आवश्यकता थी। मैंने हाइलाइट किया और LongClickकार्रवाई पर प्रतिलिपि बनाई ।

यह है कि मैंने कैसे उपयोग किया 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);

और कॉपी फ़ंक्शन:

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();
}

मुझे आशा है कि यह इस सवाल पर समाप्त होने वाले किसी व्यक्ति के लिए उपयोगी है :)


4

कोटलिन प्रोग्रामेटिकली (मैन्युअल कॉपी) का उपयोग करना

button.setTextIsSelectable(true)

या, एक कोटलिन संपत्ति एक्सटेंशन जोड़ें

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

फिर कॉल करो

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

कोटलिन प्रोग्रामेटिकली (ऑटो-कॉपी) का उपयोग करना

यदि आप उपयोगकर्ता द्वारा देखे जाने वाले लंबे-प्रेस को ऑटो-कॉपी करना चाहते हैं, तो यह आवश्यक आधार कोड है:

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
}

आप ऐसा Toastहोने की पुष्टि करने के लिए एक जोड़ना चाह सकते हैं

या, एक कोटलिन एक्सटेंशन फ़ंक्शन जोड़ें

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 (मैनुअल कॉपी) का उपयोग करना

इसे अपने में जोड़ें <TextView>

android:textIsSelectable="true"

नोट: इन सभी की आवश्यकता होती है android:enabled="true"और android:focusable="true", जो एक के लिए डिफ़ॉल्ट मान हैं TextView


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.