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 変数が生成され (レイアウトがないため、 に割り当てるビューがありません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()アクティビティで現在インフレートされて表示されているレイアウトでビューを探します。setContentView()ステートメントをメソッドの外に移動すると、通常は で呼び出されるように、Android は現在 null であるレイアウトで View を検索しようとしますonCreate()。これにより、EditText の値が null になり、NullPointerExceptionEditText のメンバー関数のいずれかを呼び出そうとすると、エラーが発生します。

于 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 に答える