質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

4298閲覧

DatePickerDialog の OnDateSetListener がコールバックされない

timy

総合スコア168

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/05/31 03:17

編集2016/05/31 03:20

DatePickerDialog で日付を選択させてアクティビティで受け取る、というシンプルな処理を実装したのですが、なぜか実機でのみ onDateSet イベントのコールバックが呼ばれません。

Android Studio標準のAVDのエミュレータ環境

Nexus S API 19 (Android 4.4.2, API 19)

では問題なく動作しています。
ところが同じビルド環境からUSBデバッグで実機にインストールすると OnDateSet のコールバックメソッドがコールされません。
実機はモトローラ社の端末で Androidバージョンは 4.4.3 です。

###該当のソースコード

Java

1public class HogeActivity extends Activity implements DatePicker.OnDateChangedListener { 2 3 protected DatePickerDialog mDialog; 4 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_hoge); 8 9 mDateSetListener = new DatePickerDialog.OnDateSetListener() { 10 public void onDateSet(android.widget.DatePicker datePicker, int year, int month, int day) { 11 // ここが処理されない 12 System.out.println("hoge"); 13 } 14 }; 15 } 16 17 /** 18 * 日付選択ダイアログ表示 19 * @param v 20 */ 21 public void showDatePickerDialog(View v) { 22 23 GregorianCalendar c = new GregorianCalendar(); 24 int year = c.get(Calendar.YEAR); 25 int month = c.get(Calendar.MONTH); 26 int day = c.get(Calendar.DAY_OF_MONTH); 27 28 // 日付設定ダイアログの作成・リスナの登録 29 if (mDateSetListener instanceof DatePickerDialog.OnDateSetListener) { 30 // ここはOKだった 31 System.out.println("Listener OK!!!"); 32 } 33 mDialog = new DatePickerDialog(this, mDateSetListener, year, month, day); 34 35 mDialog.getDatePicker().init(year, month, day, this); // set OnDateChangedListener 36 37 mDialog.setTitle(getTitle(year, month, day)); 38 mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "set date"), (Message) null); 39 mDialog.getDatePicker().setCalendarViewShown(true); 40 mDialog.getDatePicker().setSpinnersShown(false); 41 42 // 日付設定ダイアログの表示 43 mDialog.show(); 44 } 45 46 public void onDateChanged(DatePicker view, int year, int month, int day) { 47 // ここも問題なく動く 48 System.out.println("Date changed."); 49 } 50 51}

###試したこと
HogeActivity 自体が implements DatePickerDialog.OnDateSetListener するなども試しましたが結果は同様。
結局、DatePickerDialog のコンストラクタに渡している OnDateSetListener がうまくセットされていない気がします。
ちなみに DatePicker.OnDateChangedListener の設定はできていて OnDateChange は処理できてます。

とにかく、

  • エミュレータでは動作する
  • 実機では動作しない

という部分が謎です。
ごく普通の OnDateSetListener の使い方というかこれ以外はないはずなので困ってます。
できるだけ実機と同じ条件のエミュレータでも試してみますがまだ用意に時間がかかるので、何かわかる方いましたら情報いただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "set date"), (Message) null);

この行をコメントアウトしたら動きました……。
どうも onClick イベントを Message 表示に書き換えてしまうようで、本来の onClick イベントが処理されない → onDateSet も着火しない、ということだったようです。
とりいそぎ報告。

投稿2016/05/31 03:53

timy

総合スコア168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Java

1mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "set date", (Message) null);

この処理が、中で

Java

1public void setButton(int whichButton, CharSequence text, Message msg) { 2 //第三引数はOnClickListener 3 mAlert.setButton(whichButton, text, null, msg); 4}

になるので、DatePickerDialogが設定しているOnClickListenerが消えちゃっているみたいですね。

ちなみにDatePickerDialogのonClickでは、
BUTTON_POSITIVEが押されたらonDateSetで通知する処理が入っているようです。

Java

1@Override 2 public void onClick(DialogInterface dialog, int which) { 3 switch (which) { 4 case BUTTON_POSITIVE: 5 if (mDateSetListener != null) { 6 // Clearing focus forces the dialog to commit any pending 7 // changes, e.g. typed text in a NumberPicker. 8 mDatePicker.clearFocus(); 9 mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(), 10 mDatePicker.getMonth(), mDatePicker.getDayOfMonth()); 11 } 12 break; 13 case BUTTON_NEGATIVE: 14 cancel(); 15 break; 16 } 17 }

回避策としては、

Java

1Button pButton = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); 2pButton.setText("set date");

見たいな感じでいけそうな気がします。

投稿2016/05/31 03:52

編集2016/05/31 04:39
abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

timy

2016/05/31 04:08

その通りでした。ありがとうございました! ちょうど入れ違いのタイミングになってしまい失礼しました。 なぜか getButton() が取得できずnullになっちゃって再度ちょいハマりしましたが Dialog の onCreate 後でないと生成されていないということでshow()の直後に設定するよう修正、今度こそOK。
abs123

2016/05/31 04:41

getButton()がnullについては失念していました(汗 解決できたみたいでよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問