当我取消注释一个简单的方法时,应用程序崩溃

时间:2017-09-19 00:07:35

标签: java android

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开发的新手,所以任何帮助都会受到赞赏。

2 个答案:

答案 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中使用的passwordonCreate()变量与您在课程级别声明的变量不同 。因此,当您致电userLogin()时,您将获得NullPointerException,因为实例级username变量从未初始化。

如果您将onCreate()更改为如下所示:

username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);

然后你将不再拥有局部变量,一切都应该正常工作。

答案 1 :(得分:2)

简单地说,您要声明(创建)您的视图对象(例如EditTextButton)两次:一次作为类的私有成员,再一次在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布局,但您的登录方法是访问从未分配给的全局视图对象。我希望这有帮助!