在函数外部移动对象声明会导致崩溃

时间:2012-12-24 18:42:24

标签: android function object crash

此代码有效:

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}}

3 个答案:

答案 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。