¿Por qué mi aplicación de Android falla con una NullPointerException al inicializar una variable con findViewById(R.id.******) al comienzo de la clase?

Resuelto 000 asked hace 54 años • 8 respuestas

Este código, con el bloque en la parte superior comentado, se ejecuta correctamente:

public class MainActivity extends AppCompatActivity {

    /*
    EditText username = (EditText)findViewById(R.id.editText_Username);
    EditText password = (EditText)findViewById(R.id.editText_Password);
    TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
    TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
    Button login=(Button)findViewById(R.id.button_Login);
    Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);
    */

    public void doLoginOnClick(View v)
    {
        String s1=username.getText().toString();
        inputdata.setText(s1);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
        fab.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    } 
 
}

Estoy intentando capturar la identificación del componente usando

findViewById(R.id.***)

Como puede ver, puse este código en el comentario al principio del código.

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
Button login=(Button)findViewById(R.id.button_Login);
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);

Si elimino el comentario anterior y lo ejecuto (tanto en el emulador como en el dispositivo real), el programa falla inmediatamente. Me sorprende, ¿qué hay de malo aquí?

Incluso he intentado inicializar lo mismo usando el constructor.

pero si lo pongo dentro onCreate()no hay choque? ¿Por qué?

Estaba intentando obtener información del nombre de usuario y la contraseña y mostrarla en la vista de texto al textView_Inputdatausar

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
inputdata.setText(username.getText.toString()+" "+password.getText.toString());

¿Existe una forma mejor o más sencilla de hacerlo?

000 avatar Jan 01 '70 08:01 000
Aceptado

Las variables miembro de la instancia se inicializan cuando se inicializa la propia instancia. Es demasiado pronto parafindViewById()

Antes onCreate()de tu actividad aún no tienes una Windowque findViewById()necesites internamente. Antes setContentView()(que debería llamar onCreate()) tampoco se encuentran vistas.

Por lo tanto, inicie sus referencias de vista en onCreate()y después setContentView().

laalto avatar Apr 06 '2016 08:04 laalto

Añade este código

 EditText username =  findViewById(R.id.editText_Username);
 EditText password = findViewById(R.id.editText_Password);
 TextView inputdata = findViewById(R.id.textView_InputData);
 TextView welcome = findViewById(R.id.textView_Welcome);
 Button login = findViewById(R.id.button_Login);
 Button anotherLogin = findViewById(R.id.button_Login_Another);

en

onCreate(); 

método después

setContentView(R.layout.activity_main);
Devanshu Dwivedi avatar Apr 06 '2016 08:04 Devanshu Dwivedi