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
.