为什么Android应用程序在类的开始处使用findViewById(R.id。******)初始化variables时崩溃?
我只是testinginput/输出,没有特别的目的,这是成功运行的最后一个代码:
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(); } }); } }
我正在尝试使用捕获组件的ID
findViewById(R.id.***)
正如你所看到的,我把这个代码放在代码的最开始部分。
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);
如果我删除上面的注释并运行它(在模拟器和真实设备),程序立即崩溃,我很惊讶这里有什么问题?
即使我试图用构造函数初始化相同的东西。
但是,如果我把它放在onCreate()
没有崩溃? 为什么?
我试图获取用户名和密码的信息,并显示在textView_Inputdata
使用textview
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());
有更好或更简单的方法来做到这一点?
实例成员variables在实例本身初始化时被初始化。 findViewById()
为时过早
在onCreate()
之前,你的活动还没有一个findViewById()
需要的Window
。 在setContentView()
(你应该在onCreate()
调用)之前,没有可以find的视图。
因此,在onCreate()
和setContentView()
之后初始化你的视图引用。
添加此代码
`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);`
在setContentView(R.layout.activity_main)之后的onCreate()方法中,
嘿,我看到你正在定义和初始化实例variables。 我所做的是我定义的实例variables – EditText username
,然后在onCreate
方法我初始化他们 – username = (EditText) findViewById(R.id.editText_Username);
你不初始化实例variables的原因是因为元素还没有准备好,直到在onCreate
方法中的setContentView
之后 – 我可能是错误的,但我最好的做法是定义实例variables,然后在onCreate方法中初始化它们
在设置setContentView()之前,您无法初始化视图项目。因为当时视图不会存在于活动中。
将初始化保持在一个单独的方法中,并在将视图设置为活动之后调用该方法。