¿Por qué la aplicación de Android se bloquea por inicializar la variable con findViewById(R.id.******) al comienzo de la clase?
(4)
Solo estaba probando entrada / salida, no había un propósito especial, este es el último código que se ejecutó con éxito:
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 tratando de capturar la identificación del componente usando
findViewById(R.id.***)
Como puede ver, pongo 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 se bloquea de inmediato, me sorprende lo que está mal aquí.
incluso he tratado de inicializar lo mismo usando constructor.
Pero si lo pongo dentro de
onCreate()
no hay bloqueo?
¿Por qué?
Estaba tratando de obtener información de nombre de usuario y contraseña y mostrarla en la vista de texto en
textView_Inputdata
usando
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());
¿Hay alguna manera mejor o más fácil de hacer eso?
Agrega 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);
Antes de configurar setContentView () no puede inicializar los elementos de la vista, porque la vista no existirá para la actividad en ese momento.
Mantenga las inicializaciones en un método separado y llame a ese método después de configurar la vista para la actividad.
Hola, veo que estás definiendo e inicializando las variables de instancia.
Lo que hago es definir las variables de instancia:
EditText username
y luego, en el método
onCreate
, las inicializo:
username = (EditText) findViewById(R.id.editText_Username);
La razón por la que no inicializa las variables de instancia es porque los elementos no están listos hasta después de
setContentView
en el método
onCreate
; podría estar equivocado con esto, pero mi mejor práctica es definir la variable de instancia y luego inicializarlos en el método onCreate
Las variables miembro de instancia se inicializan cuando se inicializa la propia instancia.
Es muy temprano para
findViewById()
Antes de
onCreate()
su actividad aún no tiene una
Window
que
findViewById()
necesita internamente.
Antes de
setContentView()
(que debería llamar en
onCreate()
) tampoco hay vistas.
Por lo tanto, inicie sus referencias de vista en
onCreate()
y después de
setContentView()
.