为什么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()之前,您无法初始化视图项目。因为当时视图不会存在于活动中。

将初始化保持在一个单独的方法中,并在将视图设置为活动之后调用该方法。