Spannable String Error

白昼怎懂夜的黑 提交于 2019-12-31 02:59:11

问题


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


回答1:


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 ?




回答2:


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




回答3:


**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();

        }
    });

    }

}


来源:https://stackoverflow.com/questions/18033479/spannable-string-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!