0

此代码有效:

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;
    }
});
4

3 回答 3

2

那是因为如果你把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);

setContentView()你的活动onCreate()方法之后。

于 2012-12-24T18:45:08.610 回答
0

放:

EditText routineName;

在您的方法之外作为全局变量并放置:

routineName = (EditText) findViewById(R.id.routine_add_name);

onCreate()在您的函数之后(或在您setContentView()基本上调用之后)中或任何方法中。

setContentView()在 Activity 中当前膨胀且可见的布局中查找视图。如果将语句移到方法之外,Android 会尝试在当前为 null 的布局中查找 View,这setContentView()通常在onCreate(). 这会导致您的 EditText 为空值,然后NullPointerException当您尝试调用 EditText 的任何成员函数时会导致一个空值。

于 2012-12-24T18:45:21.400 回答
0

编写代码在 onCreate() 方法中声明 EditText 并使用私有变量在类中访问它

Public Class someclass extends Activity{

   private  editText;
   @override
   protected onCreate(Bundle b){
   editText = findViewById(R.id.edit);
  }
}

在类中的任何位置/任何函数中使用变量 editText。

于 2012-12-24T18:53:25.617 回答