Overview :
Expand/Collapse of Textview is the useful fuctionality in your application.
You can make a functionality like Expand/Collapse the Textview by clicking the "View More" text which is added at end of the textview.
Step 1 :
Create a new project in Eclipse File ⇒ New ⇒ Android Application Project. Fill in the details and name your project "ExpandTextViewApp".
Step 2 :
Here is a complete example of MainActivity.java
MainActivity.java
package com.sampleviewmore;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView viewMoreTextView;}
String ViewMoreString = "Displays text to the user and optionally allows them to edit it. A TextView is a complete text editor, however the basic class is configured to not allow editing; see EditText for a subclass that configures the text view for editing. To allow users to copy some or all of the TextView's value and paste it somewhere else, set the XML attribute android:textIsSelectable to true or call setTextIsSelectable(true). The textIsSelectable flag allows users to make selection gestures in the TextView, which in turn triggers the system's builtin copy/paste controls. If set, specifies that this TextView has a numeric input method and that these specific characters are the ones that it will accept. If this is set, numeric is implied to be true. The default is false.";
Context mContext = MainActivity.this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);}
setContentView(R.layout.main);
viewMoreTextView = (TextView) findViewById(R.id.ViewMoreOption);
if (ViewMoreString.length() > 300)
ViewMoreText.viewMoreTextView(mContext, viewMoreTextView,
else
Step 3 :
Coding to manage Expand/Collapse Textview
ViewMoreText.java
package com.sampleviewmore;
import android.content.Context;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ImageSpan;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
import android.widget.TextView.BufferType;
public class ViewMoreText {
static Context mContext;}
public static void viewMoreTextView(Context context,
final TextView tv, final String vieString, final int maxLine,
final String expandText, final boolean viewMore) {
mContext = context;
if (tv.getTag() == null) {
tv.setTag(vieString.trim());}
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
try {
ViewTreeObserver obs = tv.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
if (maxLine == 300) {
String text = vieString.subSequence(0, 300) + " ... ";}
SpannableStringBuilder ssb = new
SpannableStringBuilder(
Html.fromHtml(text));
ImageSpan imgSpan = new ImageSpan(mContext,
R.drawable.viewmore);
SpannableStringBuilder spanImage = new
SpannableStringBuilder(
" ");
spanImage.setSpan(imgSpan, 0, 1, 0);
ssb.append(spanImage);
ssb.append(" ");
ssb.append(expandText);
tv.setText("", BufferType.SPANNABLE);
tv.setTextSize(15);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.append(addClickablePartTextViewResizable(ssb, tv,
vieString, maxLine, expandText,
viewMore));
else {
String text = vieString + " ";}
SpannableStringBuilder ssb = new
SpannableStringBuilder(
Html.fromHtml(text));
ImageSpan imgSpan = new ImageSpan(mContext,
R.drawable.viewless);
SpannableStringBuilder spanImage = new
SpannableStringBuilder(
" ");
spanImage.setSpan(imgSpan, 0, 1, 0);
ssb.append(spanImage);
ssb.append(" ");
ssb.append(expandText);
tv.setText("", BufferType.SPANNABLE);
tv.setTextSize(15);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.append(addClickablePartTextViewResizable(ssb, tv,
vieString, maxLine, expandText,
viewMore));
} catch (Exception e) {
// TODO Autogenerated catch block}
e.printStackTrace();
});
}
private static SpannableStringBuilder addClickablePartTextViewResizable(
final Spanned strSpanned, final TextView tv,
final String viewString, final int maxLine,
final String spanableText, final boolean viewMore) {
String str = strSpanned.toString();
SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned);
try {
if (str.contains(spanableText)) {
ssb.setSpan(
new MySpannableText(false) {
@Override
public void onClick(View widget) {
if (viewMore) {
tv.setLayoutParams(tv.getLayoutParams());
tv.setText("",
BufferType.SPANNABLE);
tv.invalidate();
tv.setTextSize(15);
viewMoreTextView(mContext, tv,
1, "View Less", false);
}}
else {
tv.setLayoutParams(tv.getLayoutParams());}
tv.setText("",
BufferType.SPANNABLE);
tv.invalidate();
tv.setTextSize(15);
viewMoreTextView(mContext, tv,
300, "View More", true);
}
}, str.indexOf(spanableText) 2,
(str.indexOf(spanableText) 2) +
spanableText.length() + 2, 0);
}
} catch (Exception e) {
// TODO Autogenerated catch block
e.printStackTrace();
}
return ssb;
}
Step : 4
Coding to differentiate the ViewMore/ViewLess Text
MySpanabbleText.java
package com.sampleviewmore;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
public class MySpannableText extends ClickableSpan {
private boolean isUnderline = true;}
public MySpannableText(boolean isUnderline) {
this.isUnderline = isUnderline;}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(isUnderline);}
ds.setColor(Color.rgb(53, 144, 6));
ds.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
@Override
public void onClick(View widget) {
}
Screenshot :


Neelavathi N is a Junior Software Engineer at Span Technology Services
No comments:
Post a Comment