Androidのユーザインタフェース今昔 ①

今日も試験対策勉強やっていきましょう。
2013年1月出版の「アプリケーション技術者認定試験ベーシック対策実践問題集改訂版」を解きながら、現在との変更点に言及していきます。
本当に勉強になっているのかは知らない。

まあせっかくアウトプットしているので、間違えとかあったら教えてください。

メニュー

問1 ListViewなどで要素を長押しすることで表示されるメニューはどれ

コンテキストメニュー
「メニュー」ってちょっとざっくりしていますが、要するにAndroidがクラスとかXMLとかを提供しているメニューUIの総称と考えていいでしょうか。
現在Androidが基本的なタイプとして用意しているのはオプションメニューとコンテキストメニューとAndroid3.0以降で追加されたポップアップメニューの三種類。そのうち、コンテキストメニューは「ユーザーが要素を長押しクリックするときに表示されるフローティングメニュー」なのでこれが正解。
ところで、この問題集の解説ではオプションメニューとコンテキストメニューの二つのみ紹介されているのですが、Tipsという形でポップアップメニューが追加されています。まあ、Android3.0になったころに改訂されたんでしょう。ただ、2016年12月出版の本でもAndroidで利用できるのはオプションメニューとコンテキストメニューの二つ、と紹介されているのですが、ポップアップメニューの位置づけってどういう状態なんでしょう。わからん。

問2 MENUボタン押下時に表示されるメニューを作成する際にオーバーライドするクラスはどれ

onCreateOptionMenu
Menuボタンってそもそも「・・・」を縦にしたようなあれですかね?
正解はonCreatePptionMenu。今も現役で使えますが、3.0以降は専用のMenuボタンを表示する必要はなくなりました。その代わりに使えるものとしてActionButtonとOverflowButtonが用意されたそうです。この辺は別途フォローしなければ。

問3 オプションメニューのレイアウト定義を行うXMLの記述で正しいものはどれ(メニューに表示するアイテムのタグ名を選ぶ問題)

item
メニューに表示するアイテムは"item"タグで定義するんですね。書いたことあれば何となく見たことあるはず。
最近書いたから今も現役なはず。

問4 menuボタン押下の度にメニューの内容を更新したい場合にオーバーライドするメソッドはどれ

onPrepareOptionMenu
メニューボタンが初回に押されたときは、まずonCreateOptionMenuが呼ばれ続いてonPrepareOptionMenuがよばれます。
二回目以降はonCreateOptionMenuは呼ばれないそうなので、メニュー内容を動的に変化させる場合はこちらを使う必要があるそうな。
でもこれ、検索してもこのメソッドに関して直接言及してるページは全く引っ掛からないんですよね。不審に思ってAndroidDevelopers内で検索かけたんですが、No Resultだそうです。きな臭ーい

問5 メニューを表示するためのコードで正しいものはどれ

public boolean onCreateOptionMenu(Menu menu) {
    super.onCreateOptionMenu(menu);
    menu.add("EDIT").setIcon(R.drawable.ic_edit);
    // ...
    return true;
}

この問題は紹介しにくいですな。アプリの画面の画像があってこれを実装するコードを選べという問題なのですが、著作権とかの観点と、あと何より面倒くさいので画像とかはあんま載せないので口頭で。
メニューにテキストとアイコンを表示するのに使うメソッドはどれか。それぞれ"add"と"setIcon"ですね。
addは"android.view.Menu"インタフェースのメソッドであるのに対し、SetIconは"android.view.MenuItem"インタフェースのメソッド。ただ、addはMenuItemオブジェクトを返すので、そのまま続けて.SetIconできるんですって。ほう。

ダイアログ

ダイアログってのはボタンクリックなどのイベントに反応してポップアップする小さな画面のことだそうです。この問題集では、「警告表示用のダイアログと進捗状況表示用のダイアログをサポート」している、とありますが、日付/時刻を選択するダイアログ、"DatePickerDialog / TimePickerDialog"なんてものもあるそうなので、この辺りは別途フォローする必要がありそうです。

問1 Activityでダイアログを扱う方法として正しいものはどれ

Activityが管理するダイアログを表示するメソッドを呼び出すと、毎回onPrepareDialogが呼び出される。
onPrepareDialogもdevelopersで検索して出てこなかったのでこれもちょっと怪しい。
ダイアログで検索すると、たいていFragmentを使って表示する方法が出てくるのですが、この章ではFragmentについて全く言及されていません。Fragment自体は3.0から実装されているそうなので、この本の出版時期にはあったはずなのですが。別途勉強しておくのがよさそうですね。

問2 AlertDialogを表示する手順として正しいものはどれ

タイトルやボタンなどを設定するメソッドはBuilderオブジェクトを返すため、連続して呼び出すことができる。
Buiderを使ってアラートを設定するのはどうやら今も現役の方法みたいですね。

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("タイトル")
    .setMessage("メッセージ")
    .setPositiveButton("はい", listener)
    .setNegativeButton("いいえ", listener)
    .setNeutralButton("キャンセル", listener)
    .create().show();

こんな感じでBuilderオブジェクトを生成してsetTitleとかで要素埋め込んでいくんですって。このときそれぞれのメソッドがBuilderオブジェクトを返すので、連続で呼び出せるねっていう問題でした。

問3 AlertDialogに設定可能な要素と設定するメソッドの組み合わせで正しいものはどれ。

選択可能なリスト : setItems*
先ほどの例のsetTitleやsetMessageのように様々な要素をダイアログ上に表示させることができるみたいです。
この問題集で挙げられているのは他に、ボタン(setPositiveButton,setNegativeButtonなど様々なボタンに対応したメソッドがある)、ラジオボタン(setSingleChoiceItems)、チェックボックス(setMultiChoiceItems)。
他にsetIconができたり、setViewでviewを別に用意してカスタムビューを表示したりもできるらしい。

問4 AlertDialogに自分で作成したレイアウトを表示さるコードとして正しいのはどれ

AlertDialog.Builder builder = new AlertDilog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();

builder.setView(inflater.inflate(R.id.dialog_layout,null))
    .setTitle("タイトル")

実際は"setView"と"inflate"の部分を穴埋めで答える問題でした。setViewはさっき言ってたやつですね!
一方、もう片っぽですが、LayoutInflaterはinflateメソッドでidを指定したxmlのレイアウトから動的にviewを作ることができるそうです。setViewの引数はViewなので、findViewByIdでレイアウトのidを渡すだけじゃダメなんですねー

問5 ProgressDialogの記述で誤っているものはどれ

xmlで定義したレイアウトをsetViewメソッドにより適用できる。
ProgressDialogは待ち時間の進捗を表示するダイアログ。ひな形が作られてるんであれやこれや設定するだけで簡単に使えるんですね。逆にProgressDialogはスタイルによってレイアウトが決定されるので独自のレイアウトを設定することはできないそうです。なのでこの選択肢は間違い。
他の選択肢にも言及しておきますと、まずProgressDialog.setStyle()でスタイルが設定できます。(STYLE_HORIZONTALとSTYLE_SPINNERの二種)
また、incrementSecondaryProgressByメソッドでプログレスバーの中間の進捗状況を示すセカンダリプログレスバーを表示できるし、setIndeterminateメソッドで現在値の表示を切り替える(~%完了みたいなのを表示させる)ことができるそうです。  
 
 
今日はここまで。次回はUI➁やりまーす。