Chethan Shetty
Chethan Shetty

Reputation: 2070

Android Strike Thru Text

I'm trying to strike a text from my java code in my android application, but I'm getting Force Close. I'm using 2.3.1 emulator, I'm using the following code to strike thru

TextView tvTxt=(TextView)findViewById(R.id.textView1);
tvTxt.setPaintFlags(tvTxt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Please help me to solve this puzzle.

Thanks in advance.

This is my Logcat

07-12 17:19:41.172: E/AndroidRuntime(1777): FATAL EXCEPTION: main
07-12 17:19:41.172: E/AndroidRuntime(1777): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.colors.assasin/com.colors.assasin.MainActivity}: java.lang.NullPointerException
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.os.Looper.loop(Looper.java:123)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread.main(ActivityThread.java:3647)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at java.lang.reflect.Method.invokeNative(Native Method)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at java.lang.reflect.Method.invoke(Method.java:507)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at dalvik.system.NativeStart.main(Native Method)
07-12 17:19:41.172: E/AndroidRuntime(1777): Caused by: java.lang.NullPointerException
07-12 17:19:41.172: E/AndroidRuntime(1777):     at com.colors.assasin.MainActivity.onCreate(MainActivity.java:27)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-12 17:19:41.172: E/AndroidRuntime(1777):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)

The NullPointer rising line as in Logcat is

Caused by: java.lang.NullPointerException at com.colors.assasin.MainActivity.onCreate(MainActivity.java:27)

is

tvTxt.setPaintFlags(tvTxt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

My MainActivity.java is pretty simple

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView our_text=(TextView)findViewById(R.id.textView1);
    our_text.setPaintFlags(our_text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

    }
}

The code of activity_main.xml is

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="TextView" />

</RelativeLayout>

Upvotes: 0

Views: 469

Answers (2)

Chiral Code
Chiral Code

Reputation: 1436

Use SpannableString to get a StrikeThrough effect.

private SpannableString strikeThrough(String text) {
    SpannableString spannableString = new SpannableString(text);
    spannableString.setSpan(new StrikethroughSpan(), 0, text.length(), 0);
    return spannableString;
}

TextView our_text = (TextView) findViewById(R.id.our_text);
our_text.setText(strikeThrough((String) our_text.getText()));

Upvotes: 1

jkhouw1
jkhouw1

Reputation: 7350

Ok - I don't know what is going on... but I don't want to delete this so others can see the comments. I tested

TextView t=new TextView(mContext);
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

and it threw an NPE. I changed it to

TextView t=new TextView(mContext);
t.setText("t");
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

and it didn't. I changed it to

TextView t=new TextView(mContext);
t.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

and it didn't and finally I changed it back to

TextView t=new TextView(mContext);
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

and it didn't.

You have to have paintflags set on the textview before you can do the getPaintFlags or you will get an NPE. so perhaps you should just use

our_text.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG) 

if(our_text.getPaintFlags()!=null){
our_text.setPaintFlags(our_text.getPaintFlags()|Paint.STRIKE_THRU_TEXT_FLAG)
}
 else {
our_text.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG)
}

Upvotes: 0

Related Questions