2011-08-04 18 views
5

एक निश्चित आकार के TextView है और जब भी टेक्स्ट सेट किया जाता है, तो मैं इसे प्रीसेट मान पर फिर से सेट करना चाहता हूं।ऑनमेजर से टेक्स्ट क्यों सेट करना टेक्स्ट व्यू को प्रभावित नहीं करता है?

इसे पूरा करने के लिए मैं onMeasure ओवरराइड कर रहा हूं और setText पर कॉल कर रहा हूं। हालांकि यह TextView सामग्री को प्रभावित नहीं करता है।

मुझे क्या याद आ रही है?

संपादित करें: अगर आपको लगता है कि यह एक पूरी तरह से अलग तरीके से किया जाना चाहिए - सुझाव देने के लिए

उत्तर

4

onMeasure() आमतौर पर लेआउट के चरण के दौरान कहा जाता है संकोच न करें। जहां तक ​​मुझे पता है कि onMeasure() है जहां आप को अपने विचार को मापना है। यह 2 मान प्राप्त करता है जो आपके दृश्य के माता-पिता का आकार होता है जो स्थिर हो सकता है।

आप बस जिस पाठ को सेट कर रहे हैं उसकी लंबाई की जांच क्यों नहीं करते हैं और यदि यह बहुत लंबा है तो इसे अपने डिफ़ॉल्ट से प्रतिस्थापित करें?

0

View दस्तावेज़ीकरण पृष्ठ से।

मापित चौड़ाई और मापा ऊंचाई निर्धारित करने के लिए दृश्य और इसकी सामग्री को मापें। इस विधि को माप (int, int) द्वारा बुलाया गया है और उप-वर्गों द्वारा सटीक और उनकी सामग्री का कुशल माप प्रदान करने के लिए ओवरराइड किया जाना चाहिए।

आप TextView सीमित चौड़ाई या ऊंचाई कॉल setMaxWidth()setMaxHeight()setMaxLines() है या यह manualy की जाँच करें और जिस तरह से आप एक कस्टम विधि से पसंद

+0

दृश्य पहले से ही स्थिर आकार के लिए कॉन्फ़िगर किया गया है। अब जब यह फिट नहीं होता है तो मुझे इसके टेक्स्ट को प्रतिस्थापित करने की आवश्यकता है। – Asahi

+0

यदि contant आकार है तो आप परीक्षण कर सकते हैं और देख सकते हैं कि कितने चार्ट फिट हो सकते हैं। यदि टेक्स्टटाइज उस लंबाई से अधिक है, तो इसे बदलने के लिए – weakwire

+0

को प्रतिस्थापित करने के लिए मैं 'सेटटेक्स्ट' को कॉल कर रहा हूं लेकिन यह टेक्स्टव्यू को प्रभावित नहीं करता है - यह पहला सेटटेक्स्ट (जब आप पहली बार टेक्स्टव्यू पर लिखते हैं) को कॉल करने से पहले – Asahi

0

अपने onMeasure(int,int)

  1. में परिवर्तन होता है तो चाहते हैं कॉल करें super(int,int)
  2. getMeasuredWidth() औरका उपयोग करें

कुछ इस तरह:

void onMeasure(int a, int b){ 
    super(a,b); 
    if(getMeasuredWidth()>bla) 
     setText("default"); 
} 
0

यह है कि मैं क्या पाठ फ़ॉन्ट मामले में पाठ्य सामग्री गोटो अगली पंक्ति में काफी बड़ी है कम करने के लिए करते हैं। समस्या आपके मामले में एकमात्र अंतर है, यह है कि आप इसे किसी अन्य डिफ़ॉल्ट पाठ से बदलना चाहते हैं।

ViewTreeObserver vto = ((TextView)findViewById(R.id.myTextView)).getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       if (null != ((TextView)findViewById(R.id.myTextView))) { 
        if (1 < ((TextView)findViewById(R.id.myTextView)).getLineCount()) { 
        ((TextView)findViewById(R.id.myTextView)).setTextSize(TypedValue.COMPLEX_UNIT_PX, 
           ((TextView)findViewById(R.id.myTextView)).getTextSize() - 2); 
        } 
       } 

      } 
}); 

यह आपकी लंबाई का गतिशील रूप से ख्याल रखेगा। अब टेक्स्ट आकार या लंबाई को अलग-अलग फॉर्म कारकों के आधार पर तय नहीं किया जा सकता है। उदाहरण के लिए 3.2 इंच स्क्रीन में 20 वर्ण टेक्स्ट निश्चित रूप से बड़ा होगा हालांकि यह 4.1 इंच स्क्रीन के लिए बहुत छोटा होगा। तो मैं आपको संदर्भ के रूप में लाइन गिनती का उपयोग करने का सुझाव दूंगा और यदि पाठ लपेटता है तो आप या तो फ़ॉन्ट को कम कर सकते हैं या इसे किसी अन्य चीज़ से बदल सकते हैं।

आप .length() साथ तुच्छता पाठ निर्धारित कर सकता है इसकी लंबाई की तुलना में कटौती केवल-स्ट्रिंग डाल अपने वांछित सीमा से बड़ी है,:

0

यह मेरा विचार है। लेकिन अगर आप पूरे पाठ को प्रदर्शित करना चाहते हैं तो आप onClickListener() को TextView पर कार्यान्वित कर सकते हैं जो envoking पूरे पाठ को Dialog या जो कुछ भी दिखाएगा।

एक और दृष्टिकोण जो मैं उपयुक्त हो सकता है लगता है विभिन्न घनत्व स्क्रीन के लिए विभिन्न लेआउट बनाने के लिए और फिर अपने xml में जोड़ने है android:maxLines="your limit"android:textSize="some value" और android:maxLength="@integer/mylimit" (विभिन्न सीमा और विभिन्न घनत्व के लिए आकार)। (

String myText = "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"; 
String clickForMore="...Click for more"; 
int limit = myActivity.this.getResources().getInteger(R.integer.limit); //dont forget to declare it in your string.xml 

कल्पना कीजिए कि हम पाठ के 3 लाइनों है और हम केवल 2 की अनुमति दी कुल के साथ: तो क्या रहता है लंबाई मापने के लिए और केवल-स्ट्रिंग (या डिफ़ॉल्ट पाठ)


कुछ की तरह दिखाने के है int limit की लंबाई मान)। हमारे पाठ का टुकड़ा TextView के अंदर फिट बैठता है, लेकिन यह पूरी तरह से दिखाया नहीं गया है। हम उपयोगकर्ता को सूचित करने के लिए वहाँ पढ़ने के लिए और अधिक है कि जरूरत है ...

myTextView.setVisibility(View.INVISIBLE);// <--- takes the space in the container 
    if(clickForMore.length() < myText.length() && myText.length() > limit)// <--- avoiding negative place and checking if the entire text is inside the box or there are characters leftover. 
    { 
    String temp = myText.substring(0, limit-clickForMore.length());// <-- we cutting space from currently displayed (not original string) to append the `clickForMore` string information. 
    myTextView.setText(temp+clickForMore); 
    myTextView.setVisibility(View.VISIBLE); 
    myTextView.setOnTouchListener(new OnTouchListener() { 

     @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    // display the dialog with full text.... 
    return false; 
       } 

}); //<--- instantiate the click listener 
    } 
    else 
    { 
     //the text fits the box and no need to slice it, just display it straight forward 
    } 

myText.length() > limit - स्ट्रिंग सीमा overlaps परीक्षण करें कि। लागू .addTextChangeListener() (TextWatcher) और afterTextChange() ओवरराइड विधि में मैंने ऊपर वर्णित सभी को कार्यान्वित किया है।

फिर आप TextView के लिए onClickListener() बनाते हैं जहां आप संवाद करते हैं और फिर अपना टेक्स्ट दिखाते हैं।


मुझे आशा है कि आपको यह विचार उचित लगेगा। यदि आपको अधिक स्पष्टीकरण की आवश्यकता है जो मुझे दिमाग में था तो मुझे लिखने में संकोच न करें।

0

आप addTextChangedListener (TextWatcher watcher) के साथ एक कस्टम TextWatcher पंजीकृत कर सकते हैं।

TextWatcher के अंदर आप afterTextChanged(Editable s) फ़ंक्शन को ओवरराइड करेंगे, टेक्स्ट की लंबाई सुनिश्चित करें, और यदि बहुत लंबा हो, तो इसे अपने डिफ़ॉल्ट टेक्स्ट पर वापस सेट करें।

संपादित करें: मुझे इस बारे में बहुत यकीन नहीं है, लेकिन यही कारण है कि मुझे लगता है कि मेजर के साथ आपका समाधान काम नहीं कर रहा है: ऑन मेजर को प्रारंभिक लेआउट चरण पर कहा जाता है, या जब UI को आकार बदलने की आवश्यकता होती है, तो एक बार यूआई सेट है, यदि आप यूआई के बाद टेक्स्ट को बदलते हैं, और टेक्स्ट बहुत लंबा हो जाता है, तो यह टेक्स्ट व्यू के आकार को प्रभावित नहीं करता है, और मेजर को फिर से नहीं कहा जाता है ...

कोई भी बेहतर देखने के लिए बेहतर है पाठ में परिवर्तन के लिए बाहर है, और आप क्या चाहते हैं जब यह एक सीमा से अधिक है, और जाने एंड्रॉयड गंदा TextView माप काम

0

आप Textwatcher लागू करना चाहते हैं जाएगा करते हैं और onTextChanged(...) विधि में, फोन ०१२३४११२६८१की setEms(...) विधि, जो TextView की चौड़ाई (एन एम) की चौड़ाई तक सेट करेगी, जहां n setEms(...) के लिए इनपुट है।

... 
TextView tv = (TextView) findViewById(R.id.my_text_view); 
tv.addTextChangedListener(this); 
... 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    tv.setEms(count); 
} 
संबंधित मुद्दे