public class MainActivity extends AppCompatActivity
implements OnEditorActionListener, OnClickListener{
private EditText username;
private EditText password;
private Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText username = (EditText) findViewById(R.id.username);
EditText password = (EditText) findViewById(R.id.password);
Button login = (Button) findViewById(R.id.login);
username.setOnEditorActionListener(this);
password.setOnEditorActionListener(this);
login.setOnClickListener(this);
userLogin();
}
public void userLogin() {
String usernameString = username.getText().toString();
String passwordString = password.getText().toString();
}
@Override
public void onClick(View v) {
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
return false;
}
}
当" userLogin()"时,应用程序崩溃没有注释。我没有收到错误消息或任何迹象表明它崩溃的原因。模拟器只是说"登录屏幕已停止。"
我是Android开发的新手,所以任何帮助都会受到赞赏。
答案 0 :(得分:6)
这是Java变量“阴影”的问题。你的计划的重点是:
// these are instance variables
private EditText username;
private EditText password;
并在onCreate()
// these are local variables
EditText username = (EditText) findViewById(R.id.username);
EditText password = (EditText) findViewById(R.id.password);
问题是您在username
中使用的password
和onCreate()
变量与您在课程级别声明的变量不同 。因此,当您致电userLogin()
时,您将获得NullPointerException
,因为实例级username
变量从未初始化。
如果您将onCreate()
更改为如下所示:
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
然后你将不再拥有局部变量,一切都应该正常工作。
答案 1 :(得分:2)
简单地说,您要声明(创建)您的视图对象(例如EditText
,Button
)两次:一次作为类的私有成员,再一次在onCreate
中方法。
要解决此问题,请在username
中指定onCreate
和其他视图对象,而不使用类名:
private EditText username;
private EditText password;
private Button login;
@Override protected void onCreate(Bundle savedInstanceState) {
//...
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);
问题出现是因为您将本地创建的视图对象引用到XML布局,但您的登录方法是访问从未分配给的全局视图对象。我希望这有帮助!