1

カスタムAlertDialogを作成していますが、1 つのエラーが発生します。

次のような文字列strings.xmlを定義しました。

<string name="infoDetail">Test: <a href="http://www.google.com">Google</a></string>

次のようなカスタム レイアウトを作成しました。

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

    <TextView
        android:id="@+id/infoVersionTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:gravity="right|center"
        android:text="@string/infoVersion"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/infoVersionTitleValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/infoVersionTitle"
        android:textAppearance="?android:attr/textAppearanceLarge" />


    <TextView
        android:id="@+id/infoDetailText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/infoVersionTitle"
        android:autoLink="web"
        android:linksClickable="true"
        android:padding="4dp"
        android:text="@string/infoDetail" />

</RelativeLayout>

AlertDialogこれは、私のカスタム レイアウトでを作成するためのコードです。

case R.id.info:
    AlertDialog.Builder about = new AlertDialog.Builder(this);

    about.setTitle(getString(R.string.app_name));
    about.setIcon(R.drawable.info);
    about.setView(getLayoutInflater().inflate(R.layout.info, null));


    TextView infoDetail = (TextView) findViewById(R.id.infoDetailText);
    infoDetail.setMovementMethod(LinkMovementMethod.getInstance());

    about.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();                       
        }
    });
    about.show();               
    break;

これで私はjava.lang.NullPointerExceptionオンになっていinfoDetail.setMovementMethod(LinkMovementMethod.getInstance());ます。

この行を削除すると、カスタム レイアウトは期待どおりに表示されますが、URL はクリックできません。

私は何を間違っていますか?

4

3 に答える 3

0

ダイアログでウィジェットを使用する場合は、次のようなダイアログ名でウィジェットを参照する必要があります

TextView nameTextView = (TextView) your_dialog_name.findViewById(R.id.textviewid);

または、nullポインタ例外が表示されるので

次のようなTextViewを参照してください

   TextView infoDetail = (TextView) about.findViewById(R.id.infoDetailText);
于 2012-08-21T11:49:58.533 に答える
0

交換

about.setView(getLayoutInflater().inflate(R.layout.info, null));

TextView infoDetail = (TextView) findViewById(R.id.infoDetailText);

View v = getLayoutInflater().inflate(R.layout.info, null);
about.setView(v);
TextView infoDetail = (TextView)v.findViewById(R.id.infoDetailText);

findViewById()アクティビティではなく、ダイアログのビュー階層を呼び出す必要があるためです。指定された ID を持つビューはアクティビティ階層に存在せず、null が返されます。null に対してメソッド ( ) を呼び出そうとするsetMovementMethodと、NPE が発生します。

(ええ、私は知っています、古い質問ですが、コミュニティから未回答としてランダムにバンプされ、簡単に回答できました。)

于 2013-12-17T20:19:34.863 に答える