2016/06/09

[android]DialogFragmentから元のActivityに結果を返したい

くっ、BLE接続の前にもう1段階あった。。。

まあ、ダイアログ側でBLE接続をしてもよいのだけど、とにかくダイアログで行った結果を呼び出し元のActivityに返したい。

 

検索すると、いろいろ出てきはするのだけど、だいたい「やりたいことに対して実装が多いので簡略化する方法を考えた」というパターンが多い。

onActivityResult()なんかで返せるのかと思っていたのだが、そういう時代ではないみたいだ。


現状のソースはこちら

 

Activity側では、ダイアログをこの順番で表示させている。

  1. DialogFragmentをextendsしたクラスをnewする
  2. そいつをshow(getFragmentManager(), "xxx")する

DialogFragmentの説明を見ると、呼び出し元のActivityでイベントハンドラを作っておいて、DialogFragmentの方はgetActivity()したものをキャストしてイベントハンドラを呼び出している。

キャストするとちょっとガチガチすぎるので、interfaceとか作っておけばよいのかな。
あれ、でもgetActivity()で取ってこれるのは単なるActivityだ。
それがinterfaceをimplementsしているとかわかってくれないんじゃないか?

・・・エラーにならない。
こんなのでいいんだ。
なんか、Javaってこういうダウンキャストに対しては厳しいというイメージだったのだけど、不意に見せる優しさなのかね。
こういうギャップにぐっと来るのかもしれない。


BluetoothAdapterを渡すためにメソッドを追加したのだけど、どうもsetArguments()で渡す方がよいらしい。
Y.A.M の 雑記帳: Android Fragment で setArguments() してるサンプルが多いのはなぜ?

ほほう。
サンプルを見ると、DialogFragmentをextendsした方にnewInstance()を作って、その引数に入れてもらっているようだ。
そしてsetArguments()するところは呼ぶ人からは隠している。
よし、まねしよう。

と思ったのだが、私が渡したいのはBluetoothAdapterだ。
オブジェクトのようなものは、Serializableなどになっていないといけないみたいだ。
使いたいのはBluetoothLeScannerだから、それが得られるようなものであればなんでもよいのだけど。。。

 

しかし、getActivity()の存在を知ったので、そこからgetSystemService()してgetAdapter()すればよいことがわかるのだった。
つまり、今の時点では引数はいらないということだ。

 

今日までのソースは、こちら。
次回こそ、次回こそはBLE接続のはず。。。

https://github.com/hirokuma/AndroidTwoSpinners/tree/618c641d9b6c6b925dc9853b2b416749aa6b3726/app/src/main/java/com/blogpost/hiro99ma

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。