2

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

4

3 回答 3

1

好的,所以我认为问题来自通货膨胀过程。似乎您正在尝试在扩展布局之前访问 TextView。所以findViewById不会找到任何东西,因为它会在 Activity 布局中搜索。

这里的诀窍是首先膨胀您的自定义布局(这是您可以做的一个示例:

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

编辑1: 我在这个例子中犯了一个错误......在你的情况下getApplicationContext()应该是这个(我在代码中进行了修复)

更多信息: Android - Linkify 问题

编辑2: 好的,现在应该可以理解了吧?

于 2013-08-03T15:35:20.767 回答
1
**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();

        }
    });

    }

}
于 2013-08-04T15:26:23.127 回答
1

这段代码对我来说很好用。我希望这对你也有帮助。

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

享受......

谢谢,穆克什

于 2013-08-03T14:52:12.940 回答