2016-04-15 1 views
0

ボタンを作成する関数があります。これは、onClickイベントを持ち、関数のパラメータからいくつかの情報だけを表示するカスタムダイアログを表示します。ダイアログには2つのボタンがあり、1つはダイアログを閉じるためのボタン、もう1つはファイルに情報を追加するボタンです。NullPointerException動的ボタンのonClickEventを設定する

これらのボタンのイベントをonClickに設定しようとすると、アプリケーションがクラッシュし、エラーが表示されるのはNullPointerExceptionで、nullオブジェクト参照で仮想メソッドを呼び出そうとしています。

両方のボタンのコードを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

たぶん、あなたは '' findViewById'前に 'dialog.setContentView(R.layout.popup_exercise)が必要です。 –

答えて

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

関連する問題