0

我不知道为什么,但我一直E/AndroidRuntime(709): java.lang.NullPointerException在尝试调用标题为“是”和“否”的按钮。这些按钮是在 xml 布局中创建并使用该findViewById方法调用的,这是我在同一程序中的几个正常工作的按钮中使用的类似技术。这些按钮与其他按钮的唯一区别是它们的 xml 代码保存在一个单独的布局文件中,该文件不是 main.xml。

如果我只想显示按钮而不在 java 代码中调用它们,它们将按应有的方式显示。当我尝试在 java 代码中对它们应用任何东西时会发生错误,例如setClickable()and setOnClickListener()

下面的代码概述了 xml 中按钮和布局的创建,java 代码显示了一个在调用时创建弹出窗口的方法。

Java 代码:

    private void getLogoutOption() {
        LayoutInflater layoutInflater  = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);  
        View popupView = layoutInflater.inflate(R.layout.logoutoption, null);  
        final PopupWindow logoutoption = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        Button yes = (Button) findViewById (R.id.yes);
        yes.setClickable(true);
        yes.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                logoutoption.dismiss();
                switchActivity(8);
            }
        });

        Button no = (Button) findViewById (R.id.no);
        no.setClickable(true);
        no.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                logoutoption.dismiss();
            }
        });

    logoutoption.showAsDropDown(search, 50, -30);
}

XML 代码:

<?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"
    android:background="@android:color/transparent" >"

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/menu_default" >

        <TextView
            android:id="@+id/logoutmessage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="Are you sure you would like to logout?"
            android:textColor="@color/gold" />

        <Button
            android:id="@+id/yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/logoutmessage"
            android:layout_centerInParent="true"
            android:text="YES"
            android:textColor="@color/green" />

        <Button
            android:id="@+id/no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/logoutmessage"
            android:layout_toRightOf="@id/yes"
            android:text="NO"
            android:textColor="@color/red" />
    </RelativeLayout>

</RelativeLayout>
4

3 回答 3

2
Button yes = (Button) findViewById (R.id.yes); 

应该

Button yes = (Button) popupView.findViewById (R.id.yes); 

默认情况下findViewById(),将在您的内容视图中搜索具有指定 ID 的视图(例如,如果您使用setContentView(R.layout.main),它将在 main.xml 结构中搜索这些视图)。如果您正在搜索膨胀的布局,则必须调用findViewById()该特定的膨胀布局。

于 2012-09-19T15:40:21.560 回答
1

改变:

Button yes = (Button) findViewById (R.id.yes);
Button no = (Button) findViewById (R.id.no);

到:

Button yes = (Button) popupView.findViewById (R.id.yes);
Button no = (Button) popupView.findViewById (R.id.no);
于 2012-09-19T15:41:00.690 回答
1

嗨问题是您在 Activity 中获取 id。在 setContentView(R.layout.main) 创建的 Activity 视图中。在您的代码中,您正在膨胀新视图,因此您应该使用

按钮是 = (Button)popupView.findViewById (R.id.yes);

于 2012-09-19T15:42:39.820 回答