2010-10-23 16 views
56

मेरे पास एक बहु-रेखा TextView है जिसमें android:ellipsize="end" सेट है। मैं जानना चाहता हूं, हालांकि, यदि मैं वहां मौजूद स्ट्रिंग वास्तव में बहुत लंबा हूं (ताकि मैं सुनिश्चित कर सकूं कि पूर्ण स्ट्रिंग पृष्ठ पर कहीं और दिखाई दे)।मैं कैसे बता सकता हूं कि मेरा टेक्स्टव्यू लंबित किया गया है या नहीं?

मैं TextView.length() का उपयोग कर सकता हूं और स्ट्रिंग की अनुमानित लंबाई फिट होने के बारे में पता लगा सकता हूं, लेकिन चूंकि यह कई रेखाएं हैं, TextView लपेटने के लिए हैंडल करता है, इसलिए यह हमेशा काम नहीं करेगा।

कोई विचार?

उत्तर

95

आप TextView का लेआउट प्राप्त कर सकते हैं और प्रति पंक्ति ellipsis count की जांच कर सकते हैं। समाप्त अंडाकार के लिए, यह अंतिम पंक्ति की जांच करने के इस तरह के लिए पर्याप्त है:

Layout l = textview.getLayout(); 
if (l != null) { 
    int lines = l.getLineCount(); 
    if (lines > 0) 
     if (l.getEllipsisCount(lines-1) > 0) 
      Log.d(TAG, "Text is ellipsized"); 
} 

लेआउट चरण के बाद यह केवल काम करता है, अन्यथा लौटे लेआउट अशक्त हो जाएगा, तो अपने कोड में एक उपयुक्त जगह पर इस फोन ।

+4

यह विफल रहता है यदि आप अपने इनपुट की आखिरी पंक्ति पर कोई रिक्त स्थान नहीं रखते हैं, तो "jashdkjashdkjashdkasjhdashdkasjdhkajsdhkasjdhakjshdksjahdaksjhdajkshdkajshdkjashdkjashdja" जैसे कुछ रिक्त स्थान दर्ज करते हैं। getEllipsisCount() उस मामले में 0 लौटाएगा। इसे ठीक करने के लिए, केवल अंतिम पंक्ति की जांच करने के बजाय, आपको सभी पंक्तियों के माध्यम से लूप करना होगा और जांचें कि (l.getEllipsisCount (n)> 0) सत्य लौटाएं; सभी 0 <= n <रेखाओं के लिए। – Tiago

+0

एपीआई <= 14 में 'getEllipsisCount' फ़ंक्शन' में बग की वजह से, यह असफल हो जाएगा और पाठ में 0 \ n 'जैसे विशेष वर्ण होते हैं। तो आप समर्थन पुस्तकालयों का उपयोग करके और 'if (l.getEllipsisCount (line-1)> 0) '' के साथ' (l.getEllipsisCount (line-1)> 0 || TextViewCompat.getMaxLines (यह) को बदलकर इसे काम कर सकते हैं। '। – Bam

+0

उह, एकल पंक्ति कथन के लिए भी ब्रैकेट का उपयोग करें अगर –

2

मैंने इस समस्या के लिए श्रोता अधिसूचना के साथ एक कस्टम टेक्स्ट व्यू बनाया है। यह बहु-लाइन अंडाकार समस्या को भी ठीक करता है। आप इसे android ellipsize multiline textview

22

textView.getLayout पर जाने का तरीका है लेकिन इसके साथ समस्या यह है कि लेआउट तैयार नहीं होने पर यह शून्य हो जाता है। नीचे दिए गए समाधान का प्रयोग करें।

ViewTreeObserver vto = textview.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Layout l = textview.getLayout(); 
      if (l != null){ 
       int lines = l.getLineCount(); 
       if (lines > 0) 
        if (l.getEllipsisCount(lines-1) > 0) 
        Log.d(TAG, "Text is ellipsized"); 
      } 
     } 
    }); 
+14

हटाएं तो'OOGGobalLayoutListener() 'को हटाने के लिए मत भूलना जब आपको इसकी आवश्यकता नहीं है। – mmathieum

+1

जब यह लंबित पाया जाता है तो इसे जोड़ें: यदि (Build.VERSION.SDK_INT <16) { textview.getViewTreeObserver()। RemoveGlobalOnLayoutListener (यह); } अन्य { textview.getViewTreeObserver()। RemoveOnGlobalLayoutListener (यह); } –

+9

वीटीओ के बजाय view.post() का उपयोग करें! यह बहुत आसान है। –

3

public int getEllipsisCount (int line):

रिटर्न वर्णों की संख्या दूर ellipsized जा करने के लिए, या 0 यदि कोई अंडाकार जगह लेने के लिए है।

तो, बस फोन:

int lineCount = textview1.getLineCount(); 

if(textview1.getLayout().getEllipsisCount(lineCount) > 0) { 
    // Do anything here.. 
} 

के बाद से getLayout() से पहले लेआउट सेट कर दिया जाता बुलाया नहीं जा सकता, इस का उपयोग करें:

ViewTreeObserver vto = textview.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     Layout l = textview.getLayout(); 
     if (l != null){ 
      int lines = l.getLineCount(); 
      if (lines > 0) 
       if (l.getEllipsisCount(lines-1) > 0) 
       Log.d(TAG, "Text is ellipsized"); 
     } 
    } 
}); 

और अंत में भूल नहीं है दूर करने के लिए हटाएंऑन ग्लोबललायआउट लिस्टनर जब आपको इसे नामांकित करने की आवश्यकता होती है।

+1

आप पहले गलत हैं तो गलत है। आपको एक लाइन में गुजरना होगा। –

+0

आप सही एक के साथ जवाब संपादित करने के लिए स्वतंत्र हैं। @ फ्रांसेस्कोडोन्ज़ेलो – amalBit

+0

कोड को शानदार नहीं हो सकता है लेकिन यह दृष्टिकोण निश्चित रूप से है। इसने यह निर्धारित करने में मेरी समस्या हल की कि पाठ को elippsized किया गया है या नहीं। जब आप विंडो प्रबंधक के माध्यम से विंडो में दृश्य जोड़ते हैं तो यह दृष्टिकोण बहुत उपयोगी होता है। –

-1

getEllipsisCount का उपयोग उस पाठ के साथ काम नहीं करेगा जिसमें खाली लाइनें होंगी। मैं यह काम करने के लिए निम्न कोड का प्रयोग किया:

message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 

      if(m.isEllipsized == -1) { 
       Layout l = message.getLayout(); 
       if (message.getLineCount() > 5) { 
        m.isEllipsized = 1; 
        message.setMaxLines(5); 
        return false; 
       } else { 
        m.isEllipsized = 0; 
       } 
      } 
      return true; 
     } 
    }); 

अपने XML में एक maxLineCount स्थापित करने के लिए नहीं सुनिश्चित करें। फिर आप अपने कोड में lineCount की जांच कर सकते हैं और यदि यह किसी निश्चित संख्या से अधिक है, तो आप TextView के चित्र को रद्द करने के लिए झूठी वापसी कर सकते हैं और लाइन दृश्य के साथ-साथ ध्वज को सेट करने के लिए सेट कर सकते हैं ताकि टेक्स्ट व्यू बहुत लंबा हो या नहीं। टेक्स्ट व्यू सही लाइन गिनती के साथ फिर से खींचा जाएगा और आपको पता चलेगा कि इसका ध्वज झंडा के साथ है या नहीं।

फिर आप जो भी चाहते हैं उसे करने के लिए isEllipsized ध्वज का उपयोग कर सकते हैं।

9

मुझे लगता है कि इस सवाल का सबसे आसान समाधान निम्नलिखित कोड है:

String text = "some looooong text"; 
textView.setText(text); 
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text)); 

इस कोड को मानती है कि आपके XML में TextView सेट है कि एक maxLineCount :)

+0

आलसी लेकिन प्रभावी :- डी – msamardzic

+0

यह अब तक का सबसे आसान समाधान है। rofl – kopikaokao

+2

यदि कोई प्रकार का पूंजीकरण सेट किया गया है तो आपका परीक्षण विफल हो जाएगा। दोनों तारों में LowerCase() कॉल जोड़ें। – Yarh

0

यह मेरे

के लिए काम कर रहा है
if (l != null) { 
    int lines = l.getLineCount(); 
    if (lines > 0) { 
    for (int i = 0; i < lines; i++) { 
    if (l.getEllipsisCount(i) > 0) { 
     ellipsize = true; 
     break; 
    } 
    } 
    } 
    } 
-1

अपने के अंदर एक विधि बनाएं TextViewUtils कक्षा

public static boolean isEllipsized(String newValue, String oldValue) { 
    return !((newValue).equals(oldValue)); 
} 

कॉल इस विधि जब यह जैसे आवश्यक है:

 if (TextViewUtils.isEllipsized(textviewDescription.getLayout().getText().toString(), yourModelObject.getDescription())) 
      holder.viewMore.setVisibility(View.VISIBLE);//show view more option 
     else 
      holder.viewMore.setVisibility(View.GONE);//hide 

लेकिन textView.getLayout() से पहले दृश्य (लेआउट) सेट फोन नहीं कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे