2016/06/03

[android]ダイアログにListViewを載せよう - 前編

前回、BLE Peripheralを接続するにはユーザに選択してもらうのが一番よさそうだ、という結論に至った。
BDS ClientではListViewにデバイス名が並ぶようになっているのだが、

  • 文字を表示する
  • 何台あるかわからない
  • ユーザが選択できる

という条件になると、ListView形式くらいしか思いつかない。

もし、Peripheralの位置がはっきりわかるのであれば、地図風に表示させてタップするというやり方もあるだろうが、BLEだと位置も方向も距離もはっきりしない。

Spinnerも近いものがあるのだけど、台数が後から増えるので、期待するデバイス名があるかどうかを毎回閉じて開いてで確認するのは使いづらかろう。

Buttonが増えていってもいいけど、ボタンはあまり動的に増えたり減ったりするのはよくないように思うのだ。
物理的なボタンがそうだからだろうか?

もう、ListViewでいいよね?となってしまう。
ListViewにするのはよいとして、なるべく既存のActivityを変更せずに使えるようにしたい。
理由は、その部分だけコピーして使い回したいからだ。
Scanの開始までを独立させるのには成功していないのだが、そこまでであれば私でもコピーで対応できそうな気がする。
でも、既存のUIを変更させてListViewを追加するのは難しそうだから、ダイアログにして上にかぶせてしまえば、UIはそのままでいけるんじゃなかろうか。


古い記憶だが、Androidのダイアログは生成方法が途中で変わったような気がする。
きっと、今も変わり続けているに違いない。

ダイアログ | Android Developers
すごい、本家で日本語ページがある!
以前は日本語ページは情報が古かったので見ていなかったのだけど、自動で日本語ページが表示されているから、更新されるようになったのだろう(以前は、表示言語の選択ができた気がする)。
時代は変わっているんだねぇ。

 

デザインのガイドラインはこちらを読め、とのことだった。
Dialogs - Components - Google design guidelines
長い。。。
目次はこうなっている。

  • Behavior
  • Alerts
  • Simple menus
  • Simple dialogs
  • Confirmation dialogs
  • Full-screen dialogs
  • Specs

最後のSpcsは、ダイアログ自体の仕様みたい。

最初のBehaviorは、ダイアログはこういうものですよ、という振る舞いの説明だろうか。

Alerts、Simple menus、Simple dialogs、Confirmation dialogsは「ダイアログタイプ」のようだ。

そして、Full-screen dialogsはモバイルのみと書かれている。モバイル以外ってなんだろう?
うちのNexus7でも表示されているし。でも、Nexus7はモバイル扱いかもしれない。
Pixel Cとかだと除外されるのかな。

 

今回のイメージは、Confimation dialogsになるだろうか。
ユーザの明示的な確認を行うことになるからだ。
しかし、これだとOK/Cancelボタンを押さないといけなくなるみたいだ。
戻るボタンやCancelの場合は何もせずにダイアログを閉じるように、と。

デバイス名をタップするだけじゃなくて、ラジオボタン式にするのか。。。
うん、間違って触ってしまって接続するよりはよいのかな。


ダイアログのガイドラインを読んで、イメージが沸いたので、実装していこう。

Android Developerのページを読むと、AlertDialog+DialogFragmentを使う説明が書かれているから、それがよいのだろう。

Fragmentというと、ハードディスクとかのフラグメンテーションを思い起こしてしまうのだが、Androidでの意味は「小部分」のようなイメージみたい。
フラグメント | Android Developers
挙動を小部分に分けて、組み合わせて作り上げる、ということができるようだ。
その小部分は、Activityに由来したものを指すらしいので、UIに関する小部分、になるのかな。

試しに、サンプルソースをそのまま組み込んでみた。
Android Studioが、AlertDialogで「どっちにする?」と聞いてくるので、v7とついている方にしてみた。
classicとか書いてあるので、古いバージョンでも使えるようにとか、そういう意味なんじゃなかろうか。

今回は、Android5.0(API21)を下限にしている。
Windows版のAndroid Studioってバージョン表示が切れててわからんぞ。

image

名前だけPeripheralSelectDialogFragmentにして、まねしてみる。

DialogFragment dlg = new PeripheralSelectDialogFragment();
dlg.show(getSupportFragmentManager(), "fire");

Android Studioに怒られる。。。

Cannot resolve method 'show(android.support.v4.app.FragmentManager, java.lang.String)'

このgetSupportFragmentManager()で取得できるのが、v4ということなのだろう。
show()が期待するのは、FragmentManagerかFragmentTransactionらしい。
getSupportFragmentManager()はFragmentManagerを返すようになっているのだが、これはv4のFragmentManagerなのだ。
ということは、DialogFragmentもv4にしてやらないかんということか。

import android.support.v4.app.DialogFragment;
こうしたら直った。
この、v4とかv7とかが、あまりわかってないな。
v4, v7, v8, v13, v14, v17まであるみたいだ。
このバージョンは、APIレベルに合わせてあるように思うのだが。。。
はっ!
今回はAPI21以上と決めているから、v4とかを選んでいた時点で間違っていたのか!
 
とりあえず、ダイアログは表示されているからよしとしよう。

image

 

長くなったので、ここで区切ろう。

0 件のコメント:

コメントを投稿

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

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