2014-09-26 15 views
9

मैं निम्नलिखित लेआउट प्राप्त करने के लिए चाहते हैंएंड्रॉयड लेआउट: लपेटें दो TextView

AAAAAAAAAAAAAAAAAA 
AAAAA... BBBBBBBBB 

कहाँ AAAA एक TextView (एल्लिप्साइज = "अंत") है और बीबीबी एक TextView भी है। इसमें दो से अधिक पंक्तियां नहीं होंगी। मुझे बस दूसरे प्रकार के चारों ओर लपेटने के लिए पहले टेक्स्टव्यू की आवश्यकता है।

मुझे यह कैसे करना चाहिए? धन्यवाद

संपादित करें: जोड़ा स्क्रीनशॉट

Idea in screenshot

+2

उपयोग कर सकते हैं क्या आपका मतलब है आप BBB के लिए एक पूर्ण प्रदर्शन और एएए अंतरिक्ष स्थिति बीबीबी के बाद छोड़ दिया है के अनुसार लपेटा गया है करना चाहते हैं? –

+0

बिल्कुल ईईएस! – Stephane

+0

मुझे लगता है कि मैं आपको गलत समझता हूं, आपका एएए एक दो पंक्ति टेक्स्ट व्यू है और बीबीबी के अनुसार अपनी दूसरी पंक्ति में लपेटा गया है, है ना? मुझे नहीं लगता कि अगर उत्तर हाँ है तो मैं मदद कर सकता हूं। –

उत्तर

1

अंतिम परिणाम

enter image description here

स्पष्टीकरण

यह किसी भी तरह से सही नहीं है और इसकी ज़रूरतों को पूरा करने के लिए इसके लिए कुछ बदलाव की आवश्यकता होगी। मैंने इसे अधिक सामान्य बनाने के लिए ellipsize भाग छोड़ा, लेकिन इसके लिए कोड को अनुकूलित करना आसान होगा। विचार सरल है लेकिन इसे काम करने के लिए मुझे कुछ घंटों (केवल इसलिए कि रविवार) ले गया। हम गणना करते हैं कि दूसरे TextView से कितने अधिक वर्ण पहले की अंतिम पंक्ति में फिट होंगे। फिर उस संख्या के साथ हम कंटेनर की पृष्ठभूमि से मेल खाने वाले रंग के साथ दूसरे TextView पर अंतिम पंक्ति जोड़ते हैं, यह एक ऐसी सीमा है जिसे शायद किसी भी तरह हल किया जा सकता है, लेकिन मुझे यह प्रतीत नहीं होता है।

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

मैंने इसे एक विधि नहीं बनाया है लेकिन यह आसानी से सामान्य और पुन: प्रयोज्य हो सकता है, सिर्फ यह साबित करना चाहता था कि मैं इसे कर सकता हूं या नहीं। यहां किसी के लिए कोड और हर किसी का आनंद लेने और सुधार करने के लिए कोड है। लेआउट बस एक कंटेनर है (उदाहरण के लिए RelativeLayout) और आईडी first और second के साथ दो टेक्स्टव्यू, मैंने इसे स्पष्ट करने के लिए दूसरे रंग पर लाल रंग को लाल रंग सेट कर दिया है लेकिन यह आवश्यक नहीं है। FontMetrics http://docs.oracle.com/javase/8/docs/api/java/awt/FontMetrics.html इस वर्ग के हम इतने पर वर्ण, तार को मापने और कर सकते हैं:

कोड

final TextView first = (TextView) findViewById(R.id.textView); 
    final TextView second = (TextView) findViewById(R.id.textView2); 
    final ViewGroup container = (ViewGroup)findViewById(R.id.container); 
    final ViewTreeObserver obs = findViewById(R.id.container).getViewTreeObserver(); 

    obs.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      //Get characters from the first TextView's last line 
      String lastLine = first.getText().toString().substring(first.getLayout().getLineStart(first.getLineCount() - 1)); 

      //Calculate the number of extra characters that will fit in the first one 
      int e = 0; //Extra characters 
      int lineCount = first.getLineCount(); 
      while (lineCount == first.getLineCount() && e < second.getText().toString().length() - 1) { 
       first.append(second.getText().toString().substring(e, e + 1)); 
       e++; 
      } 

      //Remove those characters again to leave the first TextView as it was 
      String firstString = first.getText().toString(); 
      first.setText(firstString.substring(0, firstString.length() - e)); 

      //Add the last line of the first textview to the second textview 
      second.setText(Html.fromHtml("<font color='#F2F2F2'>"+lastLine+"</font>"+second.getText())); 

      //add a negative margin to the second textview equal to a line's height 
      ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) second.getLayoutParams(); 
      params.topMargin = -(int)(first.getLineHeight()+10); 
      second.setLayoutParams(params); 

      //Make sure first is on top 
      first.bringToFront(); 

      //Remove the listener 
      if (Build.VERSION.SDK_INT < 16) { 
       container.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } else { 
       container.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     } 
    }); 
-1
किसी भी लाइब्रेरी का उपयोग कर बाहर के साथ

<RelativeLayout 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" > 

    <TextView 
     android:id="@+id/AAA" 
     android:layout_toLeftOf="@+id/BBB" 
     android:layout_height="wrap_content" 
     android:maxLines="2" 
     android:layout_width="match_parent" /> 

    <TextView 
     android:id="@+id/BBB" 
     android:layout_alignParentRight="true" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" /> 
</RelativeLayout> 
+0

धन्यवाद! यह केवल एक पंक्ति है। दो लाइनों के बारे में क्या? – Stephane

+0

क्या आपका टेक्स्टव्यू दो पंक्तियों से अधिक है या यह पहले से ही अधिकतम है। – waelhe

+0

2 लाइनों की आवश्यकता है। यह या तो एक या दो लाइनों पर कब्जा कर सकता है अधिकतम – Stephane

1

RelativeLayout में ellipsization बिना TextView एएए सामान्य 2-लाइनों उच्च TextView बनाने के लिए और पाठ के साथ TextView बीबीबी "... bbbbbbbb" बनाने के लिए और गैर पारदर्शी पृष्ठभूमि के साथ इतना TextView एएए बीबीबी पीछे नहीं दिखाई देंगे।

दूसरा विकल्प प्रोग्रामेटिक रूप से ऐसा करता है - अक्षरों की मात्रा की गणना करें और उस स्ट्रिंग को काट दें जो लंबे समय से होना चाहिए।

लेकिन यदि आप मोनोस्पेस फ़ॉन्ट का उपयोग नहीं करते हैं तो उनमें से कोई भी 2 "हैक्स" 100% पर काम नहीं करेगा। मेरी अंग्रेजी के लिए खेद है।


<RelativeLayout android:layout_width="200dp" android:layout_height="70dp"> 

    <TextView android:id="@+id/aaa" 
    android:layout_width="match_parent" android:layout="match_parent" 
    android:lines="2" 
    android:typeface="monospace" /> 

    <TextView android:id="@+id/bbb" 
    android:layout_width="match_parent" android:layout="wrap_content" 
    android:typeface="monospace" 
    android:lines="1" 
    android:background="#ffffffff" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentBottom="true" /> 

</RelativeLayout> 

तुम भी एएए के लिए और इतने बीबीबी में स्ट्रिंग में पत्र की राशि गिनती की जरूरत है। तो उन 2 राशियों का योग अधिक है की अनुमति से बीबीबी स्ट्रिंग से पहले (ग्रंथों ओवरलैप होगा) जोड़ने "..." स्ट्रिंग:

BBBTextView = (TextView) findViewbyId(R.id.bbb); 

int maxLetterCount = 125; // you need to specify this number 
String AAAString = " gtgtfd def e refrfecj gjv jvrji rf wj jiefijr jgfrjf jrf" 
String BBBString = "deeded ed e ddd" 

if ((BBBString.length()+BBBString.length()) > maxLetterCount) { 
    BBBString = "... " + BBBString; 
} 

BBBTextView.setText(BBBString); 
+0

मैं रोबोटो का उपयोग करता हूं इसलिए यह monospaced नहीं है। मुझे पहला विचार पसंद है। कोड कैसा दिखता है? – Stephane

+0

आपका क्या मतलब है? लेआउट – Incredible

+0

एक्सएमएल कोड मेरे अपडेटेटेट उत्तर की जांच करें – Stephane

0

सबसे सही और सटीक समाधान केवल की वजह से प्राप्त किया जा सकता है।

-1

आप html

myTextView.setText(Html.fromHtml("<p>Any html code</p>")); 
+0

कृपया इस बारे में कुछ स्पष्टीकरण दें कि यह प्रश्न का उत्तर कैसे देता है – Huangism

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