查找控件时出现NullPointer异常,即使在显示视图后也是如此

时间:2012-03-21 12:38:04

标签: android nullpointerexception

我正在使用以下代码启动一个对话框:

        //show login dialog
        final Dialog loginDialog = new Dialog(this);

        loginDialog.setTitle(getString(R.string.Login));

        LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View dialogView = li.inflate(R.layout.logindialog, null);
        loginDialog.setContentView(dialogView);
        loginDialog.setCancelable(false);
        loginDialog.show();

        Button cmdLogin = (Button)findViewById(R.id.cmdLogin);
        Button cmdSignup= (Button)findViewById(R.id.cmdSignup);

        if(cmdLogin==null)Log.d("Null Check","cmdLogin");
        if(cmdSignup==null)Log.d("Null Check","cmdSignup");

R.layout.logindialog的XML文件是

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

    >    
    <EditText
        android:id="@+id/txtEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress" 
        android:hint="@string/EmailAddress"
        android:layout_marginTop="10dip"
        android:layout_marginBottom="10dip"
    />
    <EditText
        android:id="@+id/txtPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword" 
        android:hint="@string/Password"    
        android:layout_marginTop="10dip"
        android:layout_marginBottom="10dip"

    />
    <Switch
        android:id="@+id/switchRemember"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/RememberMe"
        android:layout_marginTop="10dip"
        android:layout_marginBottom="10dip"
        android:layout_marginLeft="10dip"        
        android:layout_marginRight="10dip"
         />
    <LinearLayout
        android:id="@+id/ButtonBoxes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        >

        <Button
            android:id="@+id/cmdSignup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/Signup" />

        <Button
            android:id="@+id/cmdLogin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/Login" />
    </LinearLayout>
</LinearLayout>

注意第一个片段中对Java代码的两次空检查,它们返回null。我找不到原因:|

5 个答案:

答案 0 :(得分:3)

您应该找到如下

    Button cmdLogin = (Button)dialogView.findViewById(R.id.cmdLogin);
    Button cmdSignup= (Button)dialogView.findViewById(R.id.cmdSignup);

答案 1 :(得分:1)

现在你正在搜索活动布局而不是在对话框布局中,找到按钮id的代码应该是这样的:

Button cmdLogin = (Button)loginDialog.findViewById(R.id.cmdLogin);
Button cmdSignup= (Button)loginDialog.findViewById(R.id.cmdSignup);

答案 2 :(得分:1)

使用View dialogView获取按钮..

    Button cmdLogin = (Button)dialogView.findViewById(R.id.cmdLogin);
    Button cmdSignup= (Button)dialogView.findViewById(R.id.cmdSignup);

答案 3 :(得分:1)

您必须从对话框视图中获取视图。

    Button cmdLogin = (Button) dialogView.findViewById(R.id.cmdLogin);
    Button cmdSignup= (Button) dialogView.findViewById(R.id.cmdSignup);

没有指定视图的 findViewById 将从主要活动的视图中获取子视图。所以只有你返回null。

答案 4 :(得分:1)

试试这个:

        LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View dialogView = li.inflate(R.layout.logindialog, null);
        loginDialog.setContentView(dialogView);
        loginDialog.setCancelable(false);
        loginDialog.show();

        Button cmdLogin = (Button)loginDialog.findViewById(R.id.cmdLogin);
        Button cmdSignup= (Button)loginDialog.findViewById(R.id.cmdSignup);

        if(cmdLogin==null)Log.d("Null Check","cmdLogin");
        if(cmdSignup==null)Log.d("Null Check","cmdSignup");