¿Por qué mi aplicación de Android falla con una NullPointerException al inicializar una variable con findViewById(R.id.******) al comienzo de la clase?
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_Inputdata
usar
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?
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 Window
que 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()
.
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);