I am trying to display some text in an alert dialog box as a hyperlink. Part of the process requires me to use SpannableString to format some text. The problem is that my application experiences a runtime error on the SpannableString part of my code.
TextView Tv= (TextView) findViewById(R.id.textView3);
SpannableString s = new SpannableString("www.google.com");
Linkify.addLinks(s, Linkify.WEB_URLS);
Tv.setText(s);
Tv.setMovementMethod(LinkMovementMethod.getInstance());
I looked in the DDMS and the Error says Java.Lang.NullPointerException. Has anyone experienced this? I Should be able to pass the SpannableString method a hardcoded string. I do not know why it is crashing like this.
This is the OnCreate function in my java file:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//System.out.println("+++++++++++++++++++++++");
TextView Tv= (TextView) findViewById(R.id.textviewH);
Tv.setText("GO!");
//System.out.println("+++++++++++++++++++++++");
SpannableString s = new SpannableString("www.google.com");
Linkify.addLinks(s, Linkify.WEB_URLS);
Tv.setText(s);
Tv.setMovementMethod(LinkMovementMethod.getInstance());
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("About T2M");
dialog.setIcon(R.drawable.ic_launcher);
dialog.setView(getLayoutInflater().inflate(R.layout.activity_about_t2m, null));
dialog.setCancelable(false);
dialog.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
});
//System.out.println("+++++++++++++++++++++++");
dialog.create();
dialog.show();
}
This is the text view in my XML file:
<TextView
android:id="@+id/textviewH"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView5"
android:layout_alignLeft="@+id/textView2"
android:autoLink="all"
android:clickable="true"
android:text="Humium"
android:textSize="15sp" />
Ok, so I think the issue come from the inflation process.
It seems like you're trying to access the TextView before you inflate the Layout. So findViewById won't find anything as it will search in the Activity Layout.
The trick here would be inflate your custom Layout first (, here's an exemple of what you could do :
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
//Inflating the custom Layout
View view = LayoutInflater.from(this).inflate(R.layout.activity_about_t2m, null);
//Searching for the TextView in it
TextView tv = (TextView)view.findViewById(R.id.textviewH);
//Then making the links
SpannableString s = new SpannableString("www.google.fr");
Linkify.addLinks(s, Linkify.WEB_URLS);
//Adding the text to the View and make the links clickable
tv.setText(s);
tv.setMovementMethod(LinkMovementMethod.getInstance());
//Finally applying the custom view we inflated (R.layout.activity_about_t2m) on the AlertDialog and ....
dialog.setView(view);
dialog.setTitle("About T2M");
dialog.setIcon(R.drawable.ic_launcher);
dialog.setCancelable(false);
dialog.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
}
);
Edit 1:
I made a mistake with this example… In your case the getApplicationContext() should be this (I made the fix in the code)
More info here :
Android - Linkify Problem
Edit 2:
Ok, so now that should be understandable right ?
This Code is working fine for me. I hope this will help you as well.
TextView richTextView = (TextView) findViewById(R.id.text_aboutus);
// this is the text we'll be operating on
SpannableString text = new SpannableString("Hi Click on Google.com and yahoo.com or Pmstudy.com");
text.setSpan(
new URLSpan("http://www.google.com/"),
13, 22, 0);
text.setSpan(new URLSpan("http://www.yahoo.com/"),
28, 36, 0);
text.setSpan(new URLSpan("http://www.pmstudy.com"), 41, 51, 0);
richTextView.setMovementMethod(LinkMovementMethod.getInstance());
richTextView.setText(text, BufferType.SPANNABLE);
Enjoy......
Thanks ,
Mukesh
**You can Use Same code in your custom Dialog as well. This is currently working for me.
you need to inflate your custom-dialog-layout in your code .**
custom_dialog.xml
//this xml is for custom Dialog.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/text_aboutus"
android:text="Hi Click on Google.com and yahoo.com or Pmstudy.com"/>
</LinearLayout>
package PackageName;
// import Files
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button show_dialog=(Button) findViewById(R.id.imgView);
show_dialog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Dialog d=new Dialog(MainActivity.this);
View v=getLayoutInflater().inflate(R.layout.custom_dialog, null);
TextView richTextView = (TextView) v.findViewById(R.id.text_aboutus);
SpannableString text = new SpannableString("Hi Click on Google.com and yahoo.com or Pmstudy.com");
text.setSpan(
new URLSpan("http://www.google.com/"),
13, 22, 0);
text.setSpan(new URLSpan("http://www.yahoo.com/"),
28, 36, 0);
text.setSpan(new URLSpan("http://www.pmstudy.com"), 41, 51, 0);
richTextView.setMovementMethod(LinkMovementMethod.getInstance());
richTextView.setText(text, BufferType.SPANNABLE);
d.setContentView(v);
d.show();
}
});
}
}