java android nullpointerexception onclicklistener

java - Excepción del puntero nulo en.setOnClickListener



android nullpointerexception (3)

Tengo un problema con un oyente clic para un botón de envío modal de inicio de sesión.

Este es el error.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ''void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'' on a null object reference

Tengo una comprensión razonable de lo que es una excepción de puntero nulo y he buscado a fondo un problema similar al mío. Intenté reformatear el oyente de clic de varias maneras, me aseguré de tener la ID de vista correcta, etc.

package... import... public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { //Variables String currentPage = ""; Stack<String> crumbs = new Stack<String>(); //Fragment managing the behaviors, interactions and presentation of the navigation drawer. private NavigationDrawerFragment mNavigationDrawerFragment; // Used to store the last screen title. For use in {@link #restoreActionBar()}. public CharSequence mTitle; //temp AuthenticateUserTokenResult authenticateUserTokenResult; String loginErrorMessage = ""; String loginErrorTitle = ""; Boolean logonSuccessful = false; Dialog loginDialog; // Login EditTexts EditText Username; EditText CompanyID; EditText Password; Button Submit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); mTitle = getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); if(authenticateUserTokenResult == null) { attemptLogin(); } } public void attemptLogin() { loginDialog = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar); loginDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); loginDialog.setContentView(R.layout.login_modal); loginDialog.setCancelable(false); //loginDialog.setOnCancelListener(cancelListener); loginDialog.show(); Submit = (Button)findViewById(R.id.Submit); Submit.setOnClickListener(new View.OnClickListener() // the error is on this line (specifically the .setOnClickListener) { @Override public void onClick(View v) { ClyxUserLogin user = new ClyxUserLogin(); Username = (EditText)findViewById(R.id.Username); user.logon = Username.getText().toString(); CompanyID = (EditText)findViewById(R.id.CompanyID); user.idCompany = Integer.parseInt(CompanyID.getText().toString()); Password = (EditText)findViewById(R.id.Password); user.password = Password.getText().toString(); user.idApplication = 142; authenticate(user); } }); }

Hay más, obviamente, pero no relevante para el tema, creo. Aquí está el archivo XML para el diálogo que tiene el botón.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#3366FF"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="#FFFFFF" > <TextView android:id="@+id/LoginTitle" android:layout_width="200dp" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_marginTop="10dp" android:layout_marginStart="10dp" android:textColor="#000000" android:textSize="20sp" android:text="Login" /> <EditText android:id="@+id/Username" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_below="@+id/LoginTitle" android:layout_margin="10dp" android:hint="Username" /> <EditText android:id="@+id/CompanyID" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_below="@+id/Username" android:layout_alignStart="@+id/Username" android:inputType="number" android:hint="Company ID" /> <EditText android:id="@+id/Password" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_below="@+id/CompanyID" android:layout_alignStart="@+id/Username" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:inputType="textPassword" android:hint="Password" /> <Button android:id="@+id/Submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/Password" android:layout_marginBottom="10dp" android:layout_centerHorizontal="true" android:text="Login" /> </RelativeLayout> </RelativeLayout>

Cualquier ayuda sería muy apreciada.


android.widget.Button.setOnClickListener (android.view.View $ OnClickListener) ''en una referencia de objeto nulo

Debido a que el botón Submit está dentro de login_modal entonces necesita usar la vista loginDialog para acceder al botón:

Submit = (Button)loginDialog.findViewById(R.id.Submit);


Intente darle a su Botón en su main.xml un nombre más descriptivo como:

<Button android:id="@+id/buttonXYZ"

(use minúsculas en sus archivos xml, al menos, la primera letra)

Y luego en su clase de actividad principal, declararlo como:

Button buttonXYZ;

En su método onCreate (Bundle savedInstanceState), defínalo como:

buttonXYZ = (Button) findViewById(R.id.buttonXYZ);

Además, mueva los botones / TextViews al exterior y colóquelos antes de .setOnClickListener; esto hace que el código sea más limpio.

Username = (EditText)findViewById(R.id.Username); CompanyID = (EditText)findViewById(R.id.CompanyID);


Submit es null porque no es parte de activity_main.xml

Cuando llame a findViewById dentro de una Activity , buscará una View dentro del diseño de su actividad.

prueba esto en su lugar:

Submit = (Button)loginDialog.findViewById(R.id.Submit);

Otra cosa: tu usas

android:layout_below="@+id/LoginTitle"

pero lo que quieres es probablemente

android:layout_below="@id/LoginTitle"

Consulte esta pregunta sobre la diferencia entre @id y @+id .