2016-04-15 43 views
0

我有一個函數,它創建一個按鈕,其中有一個onClick事件來調出一個自定義對話框,只顯示函數參數的一些信息。該對話框上還有兩個按鈕,一個用於關閉對話框,另一個用於將信息添加到文件。NullPointerException設置動態按鈕onClickEvent

當我嘗試爲這些按鈕設置onClick事件時,應用程序崩潰,而我得到的錯誤是NullPointerException,它說我試圖在空對象引用上調用虛擬方法。

如果我註釋掉爲這兩個按鈕設置onClickEventListener代碼的部分,那麼該對話框將正常顯示,並帶有按鈕。

注意:context是在類中聲明的變量。這只不過是Context context = this

代碼如下:

public void addButton(String text, int id, String areas, String details, String notes) { 
    Button button = new Button(this); 
    final String title = "Add "+text; 
    final String dName = text; 
    final String dAreas = areas; 
    final String dDetails = details; 
    final String dNotes = notes; 
    button.setText(text); 
    button.setTextColor(ContextCompat.getColor(context, R.color.buttonText)); 
    button.setTextSize(32); 
    button.setId(id); 
    if (isEven(id+1)) { 
     button.setBackgroundResource(R.drawable.buttonshapeother); 
    } else { 
     button.setBackgroundResource(R.drawable.buttonshape); 
    } 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Make custom dialog 
      final Dialog dialog = new Dialog(context); 
      Button add = (Button) dialog.findViewById(R.id.btnAddExer); 
      Button cancel = (Button) dialog.findViewById(R.id.btnCancel); 
      dialog.setContentView(R.layout.popup_exercise); 
      dialog.setTitle(title); 

      // Set the custom components now 
      TextView tName = (TextView) dialog.findViewById(R.id.lblNameData); 
      TextView tAreas = (TextView) dialog.findViewById(R.id.lblAreaData); 
      TextView tDetails = (TextView) dialog.findViewById(R.id.lblDetailsData); 
      TextView tNotes = (TextView) dialog.findViewById(R.id.lblNotesData); 
      tName.setText(dName); 
      tAreas.setText(dAreas); 
      tDetails.setText(dDetails); 
      tNotes.setText(dNotes); 

      // Add functions to buttons 
      add.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if (addExercise(dName, dAreas, dDetails, dNotes)) { // Add exercise to user's workout 
         Toast.makeText(context, "Exercise was added to your workout", Toast.LENGTH_LONG).show(); 
         dialog.dismiss(); // Close dialog 
        } else { 
         Toast.makeText(context, "There was an error adding your exercise", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 
      cancel.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        dialog.dismiss(); // Close dialog 
       } 
      }); 

      dialog.show(); // Actually show the dialog 
     } 
    }); 
    LinearLayout lay = (LinearLayout) findViewById(R.id.innerLay); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    lay.addView(button, params); 
} 

public boolean isEven(int num) { 
    if ((num&1) == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+0

完整的logcat請 –

+2

也許你需要'dialog.setContentView(R.layout.popup_exercise)''之前findViewById'。 –

回答

2

因爲您正在嘗試佈局設置爲之前找到按鈕視圖。因此,嘗試這樣的:

final Dialog dialog = new Dialog(context); 
dialog.setContentView(R.layout.popup_exercise); 
dialog.setTitle(title); 
Button add = (Button) dialog.findViewById(R.id.btnAddExer); 
Button cancel = (Button) dialog.findViewById(R.id.btnCancel); 
+0

你好,請看我對實際問題的評論。標記爲答案。謝謝! – Jono