2013-09-30 3 views
11

Ich versuche, Ellipsenansicht der Textansicht festzulegen. Verwenden Sie den folgenden Code. Ich möchte "mehr anzeigen" am Ende der abgeschnittenen Zeichenfolge nach 3 Punkten hinzufügen. Wenn dies mit derselben Textansicht möglich wäre, wäre das großartig, oder "Mehr anzeigen" in separater Textansicht funktioniert auch. Max Linien erlauben sind 4. Ich habe versucht, Breite der ersten Textansicht, aber es ließ den leeren Raum am Ende der ersten 3 Zeilen. Bitte sehen Sie das Bild unten.Legen Sie Textansicht Ellipsize und fügen Sie am Ende mehr anzeigen

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

    <TextView 
     android:id="@+id/tvReviewDescription" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:maxLines="4" 
     android:text="I tend to shy away from restaurant chains, but wherever I go, PF Chang&apos;s has solidly good food and, like Starbucks, they&apos;re reliable. We were staying in Boston for a week and after a long day and blah blah blah blah... " 
     android:textColor="@color/black" 
     android:textSize="13dp" 
     android:maxLength="280" 
     android:ellipsize="end"/> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/tvReviewDescription" 
     android:layout_alignParentRight="true" 
     android:text="@string/label_view_more" 
     android:textColor="@color/yellow" /> 
</RelativeLayout> 

enter image description here

+0

werden Sie manuell den Inhalt in diesem ..? wie: "Ich neige dazu, mich zu verstecken ..."Wenn ja, dann müssen Sie natürlich kontrollieren, ob Ihr Inhalt überschritten wird oder Sie geben eine Listenansicht ..? –

+0

@Neha können Sie über Code-Snippet ausarbeiten? Er wollte 4 Zeilen anzeigen und wenn es von 4 Zeilen dann Text und Show abgeschnitten "Mehr anzeigen", geben Sie einige Vorschläge, um mehrere Bildschirme zu behandeln. Wie man manuell umgehen? –

+0

Was passiert, wenn Sie auf Weitere anzeigen klicken? Hat dieser Text erweitert oder auf einen neuen Bildschirm? –

Antwort

4

finden Sie meine Antwort

public static void makeTextViewResizable(final TextView tv, final int maxLine, final String expandText, final boolean viewMore) { 

    if (tv.getTag() == null) { 
     tv.setTag(tv.getText()); 
    } 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public void onGlobalLayout() { 

      ViewTreeObserver obs = tv.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
      if (maxLine == 0) { 
       int lineEndIndex = tv.getLayout().getLineEnd(0); 
       String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(
         addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText, 
           viewMore), TextView.BufferType.SPANNABLE); 
      } else if (maxLine > 0 && tv.getLineCount() >= maxLine) { 
       int lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1); 
       String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(
         addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText, 
           viewMore), TextView.BufferType.SPANNABLE); 
      } else { 
       int lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1); 
       String text = tv.getText().subSequence(0, lineEndIndex) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(
         addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, lineEndIndex, expandText, 
           viewMore), TextView.BufferType.SPANNABLE); 
      } 
     } 
    }); 

} 

private static SpannableStringBuilder addClickablePartTextViewResizable(final Spanned strSpanned, final TextView tv, 
                     final int maxLine, final String spanableText, final boolean viewMore) { 
    String str = strSpanned.toString(); 
    SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned); 

    if (str.contains(spanableText)) { 


     ssb.setSpan(new MySpannable(false){ 
      @Override 
      public void onClick(View widget) { 
       if (viewMore) { 
        tv.setLayoutParams(tv.getLayoutParams()); 
        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE); 
        tv.invalidate(); 
        makeTextViewResizable(tv, -1, "See Less", false); 
       } else { 
        tv.setLayoutParams(tv.getLayoutParams()); 
        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE); 
        tv.invalidate(); 
        makeTextViewResizable(tv, 3, ".. See More", true); 
       } 
      } 
     }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0); 

    } 
    return ssb; 

} 

andere Klasse: -

import android.graphics.Color; 
import android.text.TextPaint; 
import android.text.style.ClickableSpan; 
import android.view.View; 

public class MySpannable extends ClickableSpan { 

private boolean isUnderline = true; 

/** 
* Constructor 
*/ 
public MySpannable(boolean isUnderline) { 
    this.isUnderline = isUnderline; 
} 

@Override 
public void updateDrawState(TextPaint ds) { 
    ds.setUnderlineText(isUnderline); 
    ds.setColor(Color.parseColor("#1b76d3")); 
} 

@Override 
public void onClick(View widget) { 


} 
} 

Letzter Schritt nennen:

DetailTv.setText(discription); 
makeTextViewResizable(DetailTv, 3, "See More", true); 
+3

Wie benutze ich dies mit Listview item textview ??? –

+1

funktioniert nicht im Recycler Ansicht – aj0822ArpitJoshi

13

Dies wurde während Runtime erreicht werden kann, alles, was Sie tun müssen, ist die Länge der Zeichenfolge überprüfen und Unterstrichen Mehr anzeigen wie diese am Ende der Zeichenfolge hinzufügen.

Ich habe die Länge '20' als Beispiel verwendet, können Sie entsprechend Ihrer Anforderung ändern.

final TextView result = (TextView) findViewById(R.id.textview); 

String text = "I tend to shy away from restaurant chains, but wherever I go, PF Chang&apos;s has solidly good food and, like Starbucks, they&apos;re reliable. We were staying in Boston for a week and after a long day and blah blah blah blah..."; 

if (text.length()>20) { 
    text=text.substring(0,20)+"..."; 
    result.setText(Html.fromHtml(text+"<font color='red'> <u>View More</u></font>"));  

} 
+0

Wenn Sie die Geräteausrichtung ändern, kann es sein, dass der Volltext angezeigt werden kann, und daher ist "Mehr anzeigen" nicht mehr erforderlich. Ich denke, Ihre Lösung ist weder "Schriftgröße" noch Bildschirmauflösung. – jmhostalet

+0

Vielen Dank für die Freigabe Code Snippet. Ich muss wissen, wie Click Ereignis von View More Text? –

+0

Wie wird Sie den Ereignis-Listener für View More Text ???? –

-1

Statt Android verwenden: layout_alignParentLeft = "true" in der ersten Textview Verwendung android: layout_toLeftOf = "@ + id/textView1"

Diese Pflege des überlappenden Text nehmen sollte

+0

Dies wird nie die Voraussetzung erfüllen. –

+0

Bitte erklären warum nicht? –

+3

Dies wird Leerraum in mehr als 3 Zeilen mehr anzeigen lassen. –

2

Simpler als die akzeptierte Antwort:

public static final int MAX_LINES = 3; 

String myReallyLongText = "Bacon ipsum dolor amet porchetta venison ham fatback alcatra tri-tip, turducken strip steak sausage rump burgdoggen pork loin. Spare ribs filet mignon salami, strip steak ball tip shank frankfurter corned beef venison. Pig pork belly pork chop andouille. Porchetta pork belly ground round, filet mignon bresaola chuck swine shoulder leberkas jerky boudin. Landjaeger pork chop corned beef, tri-tip brisket rump pastrami flank." 

textView.setText(myReallyLongText); 
textView.post(new Runnable() { 
       @Override 
       public void run() { 
        // Past the maximum number of lines we want to display. 
        if (textView.getLineCount() > MAX_LINES) { 
         int lastCharShown = textView.getLayout().getLineVisibleEnd(MAX_LINES - 1); 

         textView.setMaxLines(MAX_LINES); 

         String moreString = context.getString(R.string.more); 
         String suffix = TWO_SPACES + moreString; 

         // 3 is a "magic number" but it's just basically the length of the ellipsis we're going to insert 
         String actionDisplayText = myReallyLongText.substring(0, lastCharShown - suffix.length() - 3) + "..." + suffix; 

         SpannableString truncatedSpannableString = new SpannableString(actionDisplayText); 
         int startIndex = actionDisplayText.indexOf(moreString); 
         truncatedSpannableString.setSpan(new ForegroundColorSpan(context.getColor(android.R.color.blue)), startIndex, startIndex + moreString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         textView.setText(truncatedSpannableString); 
        } 
       } 
      }); 
+0

Was ist "TWO_SPACES" hier? –

+0

Buchstäblich eine Konstante von zwei Räumen. public static final String TWO_SPACES = ""; –

2

Dies wird ellipsize Wirkung.

set Boolean isCheck = true;

dieses in der xml:

<TextView 
     android:id="@+id/txt_id" 
     android:maxLines="2" 
     android:ellipsize="end" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

und der Code:

txt_id= (TextView)findViewById(R.id.txt_id); 
txt_id.setText("data"); 
txt_id.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
        if (isCheck) { 
         txt_id.setMaxLines(10); 
         isCheck = false; 
        } else { 
         txt_id.setMaxLines(2); 
         isCheck = true; 
      } 
     } 
    } 
0

Diese Lösung ein wenig einfacher ist, in Code zu implementieren. Es unterstützt keine Änderungen während des Betriebs, kann aber leicht geändert werden. genau nach angegebene Anzahl von Zeilen

public class ExpandableTextView extends TextView { 

    private final String readMoreText = "...read more"; 
    private final int readMoreColor = Color.parseColor("#4A0281"); 

    private int _maxLines = 4; 
    private CharSequence originalText; 

    public ExpandableTextView(Context context) { 
     super(context); 
     init(context); 
    } 

    public ExpandableTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    private void init(Context context) { 

     ViewTreeObserver vto = getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

      @SuppressWarnings("deprecation") 
      @Override 
      public void onGlobalLayout() { 

       ViewTreeObserver obs = getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 

       truncateText(); 
      } 
     }); 
    } 

    @Override 
    public void setText(CharSequence text, BufferType type) { 
     super.setText(text, type); 

     if (originalText == null) { 
      originalText = text; 
     } 
    } 

    @Override 
    public int getMaxLines() { 
     return _maxLines; 
    } 

    @Override 
    public void setMaxLines(int maxLines) { 
     _maxLines = maxLines; 
    } 

    public void truncateText() { 

     int maxLines = _maxLines; 
     String text = getText().toString(); 

     if (getLineCount() >= maxLines) { 

      int lineEndIndex = getLayout().getLineEnd(maxLines - 1); 

      String truncatedText = getText().subSequence(0, lineEndIndex - readMoreText.length() + 1) + readMoreText; 

      Spannable spannable = new SpannableString(truncatedText); 
      spannable.setSpan(new ForegroundColorSpan(readMoreColor), truncatedText.length() - readMoreText.length(), truncatedText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

      setText(spannable, TextView.BufferType.SPANNABLE); 

      super.setMaxLines(_maxLines); 
     } 
    } 

    public void expandText() { 
     setText(originalText); 
     super.setMaxLines(1000); 
    } 

    public void reset() { 
     originalText = null; 
    } 
} 
0

Dank Jitender des answer.Improving drauf Ich habe die unten Implementierung auf Länge text.This Basis noch nicht geschehen ideale Lösung sein könnte, wenn Sie Mehr anzeigen Option wollen, aber unter der Annahme, dass es Wenn Sie die Anzahl der Zeilen um 50 Zeichen erhöhen, wird die Lösung gut funktionieren, wenn Sie mit der Anzahl der Zeilen einstellbar sind. Die untere Lösung enthält die Option Weitere anzeigen, wenn die Textlänge größer als 150 ist. Der Text wird auf 150 Zeichen verkleinert Zeigen Sie den vollständigen Text mit der Option "Weniger anzeigen" an, und klicken Sie erneut auf "Weniger anzeigen", um den Text auf 150 Zeichen zu formatieren.Es ist keine separate Ansicht erforderlich. Außerdem funktioniert es gut mit der Textansicht von recycleview item.

if(inputText.length()>150) 
     { 
      String text=inputText.substring(0,150)+"..."; 
      final String fulltext=inputText; 

      final SpannableString ss = new SpannableString(text+"View More"); 

      ClickableSpan span1 = new ClickableSpan() { 
       @Override 
       public void onClick(View textView) { 
        // do some thing 
        SpannableString ss1 = new SpannableString(fulltext+"Show Less"); 
        ClickableSpan span2 = new ClickableSpan() { 
         @Override 
         public void onClick(View textView) { 
          // do some thing 
          textView.setText(ss); 
          textView.setMovementMethod(LinkMovementMethod.getInstance()); 

         } 
        }; 
        ss1.setSpan(span2, fulltext.length(), ss1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
        ss1.setSpan(new ForegroundColorSpan(Color.BLUE), fulltext.length(), ss1.length(), 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 


        textView.setText(ss1); 
        textView.setMovementMethod(LinkMovementMethod.getInstance()); 
       } 
      }; 
      ss.setSpan(span1, 153, 162, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      ss.setSpan(new ForegroundColorSpan(Color.BLUE), 153,162, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

      textView.setText(ss); 
      textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     } 
else 
     { 
      textView.setText(inputText); 
     } 
Verwandte Themen