android findviewbyid

¿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() .