为什么Android应用程序在类的开头使用findViewById(R.id.*******)初始化变量时崩溃?
我只是测试输入/输出,没有特殊用途,这是最后一个成功运行的代码:为什么Android应用程序在类的开头使用findViewById(R.id.*******)初始化变量时崩溃?,android,findviewbyid,Android,Findviewbyid,我只是测试输入/输出,没有特殊用途,这是最后一个成功运行的代码: public class MainActivity extends AppCompatActivity { /* EditText username = (EditText)findViewById(R.id.editText_Username); EditText password = (EditText)findViewById(R.id.editText_Password); TextView inputdata = (T
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();
}
});
}
}
我正在尝试使用
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);
如果我删除上面的注释并运行它(在emulator和real device中),程序会立即崩溃,我很惊讶这里出了什么问题
甚至我也尝试过用构造函数初始化同样的东西
但是如果我把它放在onCreate()
中就不会崩溃了?为什么?
我试图获取用户名和密码的信息,并使用
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());
有更好或更简单的方法吗?实例成员变量在实例本身初始化时初始化。现在进行
findViewById()还为时过早。
在onCreate()
之前,您的活动还没有内部需要的窗口。在setContentView()
(您应该在onCreate()
中调用)之前,也找不到任何视图
因此,在onCreate()
和setContentView()
之后初始化视图引用添加此代码
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);
在
方法后
setContentView(R.layout.activity_main);
嘿,我看到您正在定义和初始化实例变量。
我要做的是定义实例变量-EditText username
,然后在onCreate
方法中初始化它们-username=(EditText)findViewById(R.id.EditText\u username)代码>
您不初始化实例变量的原因是,元素在onCreate
方法中的setContentView
之后才准备就绪-我可能会有错误,但我的最佳做法是定义实例变量,然后在设置setContentView()之前在onCreate方法中初始化它们您无法初始化视图项。因为此时不存在活动的视图
将初始化保留在一个单独的方法中,并在将视图设置为“活动”后调用该方法。如果没有任何stacktrace,我打赌这是一个nullPointerException,由findViewById引起,返回null是由未加载布局引起的。在setContentView()之后调用它。是的,我建议这样做,并且发现它非常有效
setContentView(R.layout.activity_main);