Spannable String Error

2020-04-16 06:02发布

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" />

My Layout

3条回答
一夜七次
2楼-- · 2020-04-16 06:33
**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();

        }
    });

    }

}
查看更多
相关推荐>>
3楼-- · 2020-04-16 06:44

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

查看更多
淡お忘
4楼-- · 2020-04-16 06:58

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 ?

查看更多
登录 后发表回答