web-dev-qa-db-fra.com

Exception de pointeur NULL sur .setOnClickListener

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. 

18
Jack.Ramsden

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.

53
2Dee

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);
8
ρяσѕρєя K

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) {
            }
    });
0
Jose Kj

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);
0
BenJaminSila