J'ai un problème avec un écouteur de clic pour un bouton de soumission modal de connexion.
C'est l'erreur.
Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.widget.Button.setOnClickListener(Android.view.View$OnClickListener)' on a null object reference
J'ai une compréhension raisonnable de ce qu'est une exception de pointeur nul et j'ai cherché de manière approfondie un problème similaire au mien. J'ai essayé de reformater l'auditeur de clic de plusieurs façons, en m'assurant d'avoir le bon ID de vue, 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);
}
});
}
Il y en a plus, évidemment, mais sans rapport avec le sujet, je pense… .. Voici le fichier XML de la boîte de dialogue contenant le bouton.
<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>
Toute aide serait grandement appréciée.
Submit
est null
car il ne fait pas partie de activity_main.xml
Lorsque vous appelez findViewById
dans une Activity
, il cherchera une View
dans la présentation de votre activité.
essayez ceci à la place:
Submit = (Button)loginDialog.findViewById(R.id.Submit);
Une autre chose: vous utilisez
Android:layout_below="@+id/LoginTitle"
mais ce que vous voulez c'est probablement
Android:layout_below="@id/LoginTitle"
Voir cette question à propos de la différence entre @id
et @+id
.
Android.widget.Button.setOnClickListener (Android.view.View $ OnClickListener) ' sur une référence d'objet null
Parce que le bouton Submit
est à l'intérieur de login_modal
, vous devez donc utiliser la vue loginDialog
pour accéder au bouton:
Submit = (Button)loginDialog.findViewById(R.id.Submit);
J'ai aussi eu une erreur similaire quand j'ai égaré le code
text=(TextView)findViewById(R.id.text);// this line has to be below setcontentview
setContentView(R.layout.activity_my_otype);
//this is the correct place
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Je l'ai obtenu en plaçant le code dans le bon ordre, comme indiqué ci-dessous
setContentView(R.layout.activity_my_otype);
text=(TextView)findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Essayez de donner à votre Button dans votre fichier main.xml un nom plus descriptif, tel que:
<Button
Android:id="@+id/buttonXYZ"
(utilisez des minuscules dans vos fichiers xml, au moins la première lettre)
Et ensuite, dans votre classe MainActivity, déclarez-le comme:
Button buttonXYZ;
Dans votre méthode onCreate (Bundle savedInstanceState), définissez-la comme suit:
buttonXYZ = (Button) findViewById(R.id.buttonXYZ);
Déplacez également les boutons/TextViews à l'extérieur et placez-les avant le .setOnClickListener - cela rend le code plus propre.
Username = (EditText)findViewById(R.id.Username);
CompanyID = (EditText)findViewById(R.id.CompanyID);