Android Kotlin基礎講座 03.3: 外部のアクティビティを起動する
目次
タスク:implicit intentと”シェア”メニューアイテムを追加する
このタスクでは、ユーザーがゲーム結果を共有できるようにするために、共有機能をアプリに追加するためのimplicit intentを利用します。GameWonFragmentクラス内のオプションメニューとして共有機能を実装していきます。アプリのUIとしてはメニューアイテムはシェアアイコンとして、Congratulations画面のトップに表示されます。
Implicit intents
ここまではアクティビティ内のフラグメント間の遷移にナビゲーションコンポーネントを利用してきました。Androidには他のアプリのアクティビティに遷移するためのintentsというものもあります。AndroidTriviaアプリでこの機能を使ってユーザーがゲーム結果をシェアできるようにします。
IntentとはAndroidコンポーネント間でやり取りをするためのシンプルなメッセージオブジェクトです。implicit intentを用いると、どのアプリ、アクティビティが処理を行うかを把握しなくてもアクティビティを起動できます。例えば、アプリ内で写真を撮らせたい場合、数あるカメラアプリ内で、どのアプリやアクティビティが写真を撮るという処理を行うかは気にしないはずです。複数のアプリが同じimplicit intentを扱うことができる場合、Androidはユーザーに選択肢を表示し、ユーザーがその処理を行うアプリを選択できるようにします。
それぞれのimplicit intentはどんな処理が行われるかのタイプを示したACTIONという情報を持っている必要があります。一般的なACTIOnはACTION_VIEW、ACTION_EDIT、ACTION_DIALなどといったものです。それらはIntentクラス内に定義されています。
紛らわしい用語:ここで使われているアクション(ACTION)はナビゲーショングラフで出てきたアクションとは一切関係がありません。混同しないようにしてください。
ステップ1:オプションメニューをCongratulations画面に追加する
- GameWonFragment.ktを開いてください。
- onCreateView()メソッドのreturn文の前でsetHasOptionMenu()メソッドを呼び出し、引数にtrueを渡してください。
setHasOptionsMenu(true)
ステップ2:implicit intentをビルドし呼び出す
ユーザーのゲームデータに関するメッセージを送るIntentをビルド、呼び出しするためにコードを修正します。ACTION_SEND intentを扱えるアプリは複数あるので、ユーザーがどうやって自分の情報を送るかを選択できるように選択肢を表示します。
- GameWonFragmentクラスのonCreateView()メソッドの前に、以下のようなgetShareIntent()というプライベートなメソッドを作成してください。args用の値を代入している行のコードはこのクラスのonCreateView()内で使われているコードと同じです。
メソッドのコードの残りの部分では、ユーザーがシェアしたいメッセージを運ぶためのACTION_SEND intentをビルドしています。データのMIMEタイプとはstType()メソッドによって指定されています。実際に運ばれるデータはEXTRA_TEXT内で指定されています。(share_succsess_textというstringがstrings.xmlに定義されています)
// Creating our Share Intent
private fun getShareIntent() : Intent {
val args = GameWonFragmentArgs.fromBundle(arguments!!)
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.setType("text/plain")
.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_success_text, args.numCorrect, args.numQuestions))
return shareIntent
}
- getShareIntent()メソッドの下にshareSuccess()メソッドを作成してください。このメソッドではgetShareIntent()からIntentを取得し、共有するためにstartActivity()を呼び出します。
// Starting an Activity with our new Intent
private fun shareSuccess() {
startActivity(getShareIntent())
}
- スターターコードには既にwinner_menu.xmlメニューファイルが含まれています。onCreateOptionMenu()をオーバーライドして、winner_menuをインフレートします。
getShareIntent()を使ってshareIntentを取得してください。shareIntentがアクティビティとして機能するかをAndroid packageマネージャー(PackageManager)でチェックします。これにはアプリと端末にインストールされたアクティビティのトラックを保存されています。アクティビティのpackageManagerプロパティを使って、パッケージマネージャにアクセスします。もし結果がnullだった場合、インフレートされたメニュー内のshareIntentが正しく機能しておらず、非表示にされます。
// Showing the Share Menu Item Dynamically
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
inflater?.inflate(R.menu.winner_menu, menu)
// check if the activity resolves
if (null == getShareIntent().resolveActivity(activity!!.packageManager)) {
// hide the menu item if it doesn't resolve
menu?.findItem(R.id.share)?.setVisible(false)
}
}
- メニューアイテムを扱うために、onOptionsItemSelected()をオーバーライドしてください。メニューアイテムがクリックされたらshareSuccess()メソッドを呼び出してください。
// Sharing from the Menu
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) {
R.id.share -> shareSuccess()
}
return super.onOptionsItemSelected(item)
}
- アプリを起動してください。(起動前にGameWonFragment.ktにインポート文がいくつか必要になる場合があります)
ゲームクリア後、シェアアイコンがアプリバーの右上に表示されていることを確認してください。シェアアイコンをクリックして、ゲーム結果メッセージを共有してみてください。
a
完成済みプロジェクト
完成済みプロジェクトは以下からダウンロードできます。
AndroidTrivia-Solution