アプリケーションに、カスタムアラートダイアログを開くためのボタンがあります。このアラートダイアログは、XMLファイルからコンテンツを取得します。その中にボタン(filterButtonと呼ばれる)、ラジオボタン、およびスライダーバーがあります。プログラム的に、さらに2つのボタンが追加されています([OK]、[キャンセル])。
ダイアログアラートを開くと、コンテンツは完全に表示されますが、これまでのところイベントは作成されていません。(アラートダイアログを開いてコンテンツを表示するのに問題はありません)
ここで、「filterButton」のリスナーを追加します。いつものように、私は自分のボタン(Button filterButton;)、setOnClickListenerをこのように宣言しました(私のonCreateで):
filterButton = (Button) findViewById(R.id.filter_button);
filterButton.setOnClickListener(filter_listener);
次に、リスナーを定義します。
OnClickListener filter_listener = new OnClickListener() {
@Override
public void onClick(View v) {
// showPopupMenu(v);
} };
問題がこのメソッドに起因しないことを確認するために、内部のメソッドをコメントアウトしました。そして、これを行ったので、アプリを実行しようとすると、アラートダイアログを開くボタンがあるアクティビティを開こうとするとクラッシュします。これらの数行を外すと、再び機能します。わかりません、意味がありません。リスナーが付いたボタンです。このようなボタンが数十個ありますが、問題はありません。アラートダイアログに表示されるときに問題が発生するのはなぜですか。
ps:私のlogcatはいつものように役に立たず、詳細なしでFatalErrorとnullpointerexceptionと言っているだけです。
編集:私は以下に提案されているようにこれに変更しました:
filterButton = (Button) alertDialog.findViewById(R.id.filter_button);
filterButton.setOnClickListener(filter_listener);
プログラムの最初に置くとalertDialogに赤で下線が引かれているので、これをここに置きましたが、それでもクラッシュします:
OnClickListener dialog_listener = new OnClickListener() {
@Override
public void onClick(View v) {
LayoutInflater myLayout = LayoutInflater.from(context);
View dialogView = myLayout.inflate(R.layout.alertdialog_filter, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
Bundle bundle = getIntent().getExtras();
int filterVariable = bundle.getInt("filterVariable");
alertDialogBuilder.setTitle("Filter Mode");
alertDialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
// set alertdialog_filter.xml to alertdialog builder
alertDialogBuilder.setView(dialogView);
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
filterButton = (Button) alertDialog.findViewById(R.id.filter_button);
filterButton.setOnClickListener(filter_listener);
// show it
alertDialog.show();
}
};
違いは、アクティビティを開いてもクラッシュしないが、alertdialogを開くはずのボタンをクリックしたときにクラッシュすることです。