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

Android 查找控件时出现NullPointer异常,即使在显示视图后也是如此,android,nullpointerexception,Android,Nullpointerexception,我正在使用以下代码启动一个对话框: //show login dialog final Dialog loginDialog = new Dialog(this); loginDialog.setTitle(getString(R.string.Login)); LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVIC

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

        //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检查,它们返回null。我找不到原因:|

你应该找到以下几点

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

现在,您正在“活动”布局而不是对话框布局中搜索,查找按钮id的代码应如下所示:

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

使用查看对话框查看获取按钮

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

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

    Button cmdLogin = (Button) dialogView.findViewById(R.id.cmdLogin);
    Button cmdSignup= (Button) dialogView.findViewById(R.id.cmdSignup);
没有指定视图的findViewById将从主活动的视图中获取子视图。因此,只有您返回空值。

请尝试以下操作:

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