TextView返回NPE以进行对话

时间:2014-03-07 17:39:25

标签: android android-alertdialog

我有一个显示对话框的方法,里面包含一个textview。所以我试图将该textview设置为tvD.setText("SELECT")的文本。但由于某种原因,该应用程序给了我NPE。这是我的代码

这是prompts.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp" >

<TextView
    android:id="@+id/tvD"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="PICK"
    android:textAppearance="?android:attr/textAppearanceLarge" />

 </LinearLayout>

这是方法alertDialog

public void alertDialog() {
    final Context context = this;

    // get prompts.xml view
    LayoutInflater li = LayoutInflater.from(context);
    View promptsView = li.inflate(R.layout.prompts, null);
    final TextView tvDialog = (TextView) findViewById(R.id.tvD);
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            context);
    // set prompts.xml to alertDialog builder
    alertDialogBuilder.setView(promptsView);
    // set its text
    tvDialog.setText("HELLO");
    // set dialog message
    alertDialogBuilder.setCancelable(false).setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();

}

为什么我会得到这个NPE?

2 个答案:

答案 0 :(得分:2)

您正在从错误的位置找到TextView,请按以下步骤操作:

 // get prompts.xml view
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.prompts, null);
final TextView tvDialog = (TextView) promptsView.findViewById(R.id.tvD);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

您必须使用膨胀的视图来查找正确的对话框的TextView。

答案 1 :(得分:1)

更改为

View promptsView = li.inflate(R.layout.prompts, null);
final TextView tvDialog = (TextView)promptsView.findViewById(R.id.tvD);

TextView属于夸大的布局。 findViewById在当前的infalted布局中查找视图。因此,您需要使用view对象初始化TextView