2013-03-22 10 views
14

में लंबित है, तो के रूप में चौड़ाई के साथ TextView है। इस TextView में मैंने टेक्स्ट सेट किया है, लेकिन पाठ हर बार एक ही लंबाई का नहीं है। जब टेक्स्ट बहुत लंबा होता है तो मैं सिंगल लाइन सच्चाई और ellipsize: अंत का उपयोग करता हूं। लेकिन अब मुझे एक समस्या है। मैं अन्य लेआउट की दृश्यता सेट करना चाहता हूं लेकिन यह मेरे पाठ की लंबाई पर निर्भर करता है। यदि स्क्रीन में फिट होने के लिए टेक्स्ट बहुत लंबा है, तो मैं सही दिखाना चाहता हूं, लेकिन जब टेक्स्ट छोटा होता है और जब मुझे इलिप्सिज़ की आवश्यकता नहीं होती है, तो मैं दृश्यता को गलत सेट करना चाहता हूं। इसलिए मुझे अपने टेक्स्ट व्यू की स्थिति की जांच करनी है। जब इसकी इलिप्सिज़ मैं setVisible सच करना चाहता हूं, जब यह setVisible गलत नहीं है। मैं यह कैसे कर सकता हूँ। यह मैं क्या मिल गया है:जांचें कि क्या टेक्स्टव्यू एंड्रॉइड

tvAle.post(new Runnable() { 

     @Override 
     public void run() { 

      int lineCount = tvAle.getLineCount(); 
      Paint paint = new Paint(); 
      paint.setTextSize(tvAle.getTextSize()); 
      final float size = paint.measureText(tvAle.getText().toString()); 
      Log.v("a", ""+size+" "+tvAle.getWidth()); 
      if ((int)size > (tvAle.getWidth()+10)) { 
       allergiesLayout.setVisibility(View.VISIBLE); 
      } 

      else 
       allergiesLayout.setVisibility(View.GONE); 

     } 

लेकिन इस समाधान काम नहीं करता।

+0

पोस्ट कोड। बताओ कि क्या कोई त्रुटि है या नहीं। ताकि लोग बेहतर समझ सकें कि आप क्या पूछना चाहते हैं और वास्तव में आपकी समस्या कहां है। –

+0

संभावित डुप्लिकेट [मैं कैसे बता सकता हूं कि मेरा टेक्स्टव्यू लंबित किया गया है?] (Http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized) –

उत्तर

43

आप इस पद्धति प्रदान की उपयोग कर सकते हैं: getEllipsisCount

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

जहां लाइन getLineCount()

+0

क्या आप मुझे इस विधि के साथ कोई उदाहरण दिखा सकते हैं? – user1302569

+0

बस अपने टेक्स्टव्यू पर एक विधि कॉल करें। जोड़ा गया कोड (परीक्षण नहीं किया गया) – Calvin

+0

बहुत अच्छा काम करता है, अगर आप "setText" का उपयोग करते हैं, तो – user1302569

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 स्थापित करने के लिए नहीं सुनिश्चित करें। फिर आप अपने कोड में लाइनकाउंट की जांच कर सकते हैं और यदि यह किसी निश्चित संख्या से अधिक है, तो आप टेक्स्ट व्यू के चित्र को रद्द करने के लिए झूठी वापसी कर सकते हैं और लाइनव्यू के साथ-साथ ध्वज को सेट करने के लिए सेट कर सकते हैं ताकि टेक्स्टव्यू बहुत लंबा हो या नहीं। टेक्स्टव्यू सही लाइन गिनती के साथ फिर से खींचेगा और आपको पता चलेगा कि इसका ध्वज झंडा के साथ है या नहीं।

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

+0

मुझे लगता है कि 'm.isEllipsized' कक्षा में केवल एक ध्वज सेट है जिसमें कोड ब्लॉक है उदाहरण – Muxa

8

अच्छा, स्वीकार्य समाधान काम करता है लेकिन कुछ कोने के मामलों को याद करता है क्योंकि यह केवल लंबित वर्णों के लिए अंतिम पंक्ति की जांच करेगा। यदि हमारे पास टेक्स्ट लाइन में दो लाइनें हैं और TruncateAt.START का उपयोग अपनी शुरुआत में टेक्स्ट को छोटा करने के लिए करें, तो स्वीकृत उत्तर विफल हो जाएगा। : -/

ViewTreeObserver.OnPreDrawListener जोड़ना मेरे लिए वास्तव में महंगा महंगा लगता है। इसलिए मैंने स्वीकृत उत्तर के कोड में निम्नलिखित सुधार किए:

/** 
* Checks if the text of the supplied {@link TextView} has been ellipsized. 
* 
* @param textView 
*   The {@link TextView} to check its text. 
* 
* @return {@code True} if the text of the supplied {@code textView} has been ellipsized. 
*/ 
public static boolean isTextViewEllipsized(final TextView textView) { 
    // Initialize the resulting variable 
    boolean result = false; 
    // Check if the supplied TextView is not null 
    if (textView != null) { 
     // Check if ellipsizing the text is enabled 
     final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); 
     if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { 
      // Retrieve the layout in which the text is rendered 
      final Layout layout = textView.getLayout(); 
      if (layout != null) { 
       // Iterate all lines to search for ellipsized text 
       for (int index = 0; index < layout.getLineCount(); ++index) { 
        // Check if characters have been ellipsized away within this line of text 
        result = layout.getEllipsisCount(index) > 0; 
        // Stop looping if the ellipsis character has been found 
        if (result) { 
         break; 
        } 
       } 
      } 
     } 
    } 
    return result; 
} 

हालांकि, सुधार के लिए अभी भी जगह है। लेकिन यह विधि मेरे उपयोग के मामलों को पर्याप्त है। सुधार और सुधार की सराहना की जाती है। :-)

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