此代码有效:
public void saveRoutine() {
datasource = new RoutinesDataSource(this);
datasource.open();
EditText routineName = (EditText) findViewById(R.id.routine_add_name);
String routineString = routineName.getText().toString();
if (routineString.length() == 0) {
Toast toast_routine_name_empty = Toast.makeText(this, getString(R.string.toast_routine_name_empty), Toast.LENGTH_SHORT);
toast_routine_name_empty.show();
}
else {
datasource.createRoutine(routineString);
Toast toast_added = Toast.makeText(this, getString(R.string.toast_routine_added), Toast.LENGTH_SHORT);
toast_added.show();
this.finish();
}
}
但是,当我将行EditText routineName = (EditText) findViewById(R.id.routine_add_name);
移到saveRoutine()
上面的saveRoutine()
行时,会导致我的应用崩溃。
如何制作它以便我可以使用除saveRoutine()
函数以外的对象?
例如,我想使用saveRoutine()
函数下面的代码来实现这一点,当按下ENTER键时,它会调用routineName.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
saveRoutine();
return true;
default:
break;
}
}
return false;
}
});
:
{{1}}
答案 0 :(得分:2)
这是因为如果您将EditText routineName = (EditText) findViewById(R.id.routine_add_name);
置于方法之上,那么整个语句将是全局的,而findViewById()
将在 setContentView()
之前执行。
这将导致null变量(没有布局,因此不会有要分配给routineName
的视图),然后会产生NullPointerException
。你最好的选择是routineName
全局,所以
EditText routineName;
在saveRoutine()
方法之外。为了便于阅读和正确练习,请在所有方法之前在类声明的顶部声明它。
然后做
routineName = (EditText) findViewById(R.id.routine_add_name);
在您的活动的setContentView()
方法中onCreate()
之后。
答案 1 :(得分:0)
把:
EditText routineName;
在方法之外作为全局变量并放置:
routineName = (EditText) findViewById(R.id.routine_add_name);
在onCreate()
函数之后的任何方法中(或在您基本上调用setContentView()
之后)。
setContentView()
在“活动”中当前膨胀且可见的布局中查找视图。如果您将语句移到方法之外,那么Android会尝试在布局中查找当前为null的视图,因为setContentView()
通常在onCreate()
中调用。这会导致EditText为null值,当您尝试调用EditText的任何成员函数时,会导致NullPointerException
。
答案 2 :(得分:0)
在onCreate()方法中编写声明EditText的代码,并使用私有变量在类中访问它
Public Class someclass extends Activity{
private editText;
@override
protected onCreate(Bundle b){
editText = findViewById(R.id.edit);
}
}
在类中的任何地方/任何函数中使用变量editText。