2012-12-24 61 views
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; 
    } 
}); 

回答

2

這是因爲,如果你把EditText routineName = (EditText) findViewById(R.id.routine_add_name);你的方法之上,即整個陳述將是全球性的,並且findViewById()將在setContentView()之前執行

這將導致一個空變量(沒有佈局,因此將不會有一個視圖分配到routineName),然後導致NullPointerException。最好的辦法是讓routineName全球性的,所以只做

EditText routineName; 

saveRoutine()方法之外。爲了可讀性和正確的做法,在所有方法之前將其聲明在類聲明的頂部。

然後做

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

在活動的onCreate()方法setContentView()之後。

0

地說:

EditText routineName; 

外面你的方法作爲全局變量和放:

routineName = (EditText) findViewById(R.id.routine_add_name); 
或以任何方法

onCreate()功能之後(或者你叫setContentView()後基本)。

setContentView()在活動中的當前充氣和可見佈局中查找視圖。如果您將該語句移到方法外部,則Android會嘗試在當前爲空的佈局中查找視圖,因爲setContentView()通常在onCreate()中調用。這導致您的EditText爲null值,然後在您嘗試調用EditText的任何成員函數時導致NullPointerException

0

寫)的代碼聲明中的onCreate的EditText上(方法與私有變量來訪問它的類

Public Class someclass extends Activity{ 

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

內的任何地方使用變量EDITTEXT /任何函數的類。

+0

對不起fr我可憐的格式,我從移動訪問stackoverflow,它是皮塔餅。 –

+0

id而不是創建一個如此簡單的東西的子類。 – scarhand