此代码有效:

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()函数下面的代码来制作它,因此当按ENTER键时,它将调用saveRoutine():
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;
    }
});

最佳答案

这是因为,如果将EditText routineName = (EditText) findViewById(R.id.routine_add_name);放在方法上方,则整个语句将是全局的,并且findViewById()将在 setContentView()之前执行

这将导致生成一个null变量(没有布局,因此将没有View分配给routineName),然后导致NullPointerException。最好的选择是将routineName设置为全局,所以只需

EditText routineName;

saveRoutine()方法之外。为了便于阅读和正确实践,请在类声明的所有方法之前声明它。

然后做
routineName = (EditText) findViewById(R.id.routine_add_name);

在您的Activity的setContentView()方法中的onCreate()之后。

关于android - 将对象声明移到函数外部会导致崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14024717/

10-08 20:41