2013-09-30 49 views
11

我想设置文本视图的椭圆大小。使用下面的代码。我想在3个点之后在截断的字符串的末尾添加“查看更多”。如果使用相同的文本视图可能会很好,或者在单独的文本视图中“查看更多”也是可行的。最大线数允许为4.我尝试设置第一个文本视图的宽度,但它在前三行结束时留下了空白空间。请看下面的图片。设置文本查看椭圆大小并在末尾添加查看更多

<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

你会手动给这个内容吗..?像:“我倾向于回避......“如果是,那么显然你必须控制你的内容被超过,否则你会给一个列表视图..? –

+0

@Neha可以通过代码片段详细说明吗?他想显示4行,如果超过4行,则截断文本并显示'查看更多',给出一些处理多个屏幕的建议。如何手动处理? –

+0

如果您点击查看更多内容会发生什么?请阅读更多文章扩展或转到新屏幕? –

回答

4

查找我的回答

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; 

} 

另一类: -

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) { 


} 
} 

最后一步称之为:

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

如何使用这与列表视图项目textview ??? –

+1

不能在再循环器视图中使用 – aj0822ArpitJoshi

13

这可以在运行时实现的,所有你需要做的是检查字符串的长度,并添加下划线查看更多的类似这样的字符串的结尾。

我以长度'20'为例,您可以根据您的要求进行更改。

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

如果您调整设备方向,可能会显示全文,因此“查看更多”不再是必要的。我认为您的解决方案既不是“字体大小”也不是独立于屏幕分辨率。 – jmhostalet

+0

感谢您的分享我需要知道如何执行查看更多文本的点击事件? –

+0

如何设置事件监听器查看更多文本???? –

-1

而不是使用 的Android的:在第一TextView中使用layout_alignParentLeft = “真” 机器人:layout_toLeftOf = “@ + ID/textView1”

这应该采取的重叠文字的护理

+0

这永远不会满足要求。 –

+0

请解释为什么不能? –

+3

这将在更多的3行视图中留下空白区域。 –

2

比接受的答案简单:

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

什么是“TWO_SPACES”? –

+0

字面上是两个空格的常量。 public static final String TWO_SPACES =“”; –

2

这将有ellipsize效果。

set boolean isCheck = true;

把这个在XML:

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

,代码:

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

该解决方案更容易一点的代码来实现。它不支持即时更改,但可以轻松进行修改。

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

由于Jitender的answer.Improving上我做了基于text.This的长度以下的实施,如果你想查看更多选项准确指定后的行数可能不是理想的解决方案,但假设有单行约50个字符的解决方案将工作得很好,如果你可以用线条数量调整。下面的解决方案将添加查看更多选项,如果文本长度大于150,并将椭圆化文本为150个字符。点击查看更多它将使用Show Less选项显示完整文本,再次单击Show Less时,它会将文本椭圆化为150个字符。不需要单独的视图。此外,它适用于recyclerview项目的文本视图。

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); 
     }