アンドロイドスピナー(Android Spinner)は、ドロップダウンメニューです。スピナーをクリックすると、選択可能なメニューが見えて、このメニューのいずれかを押したときの出力値を別の方法で行うことができます。
AndroidX RecyclerView実装(kotlin)文で実装されたのは、 Android Dev Submmit
のYoutube情報をRecyclerViewに示しアプリでした。
このプロジェクトにスピナーを追加して、 Android Dev Submmit
と Google I / O
二つの情報を選択的に表示するようにアプリを実装してみます。
プロジェクトの作成
AndroidX RecyclerView実装(kotlin)で作成したプロジェクトでSpinnerを追加します。
このプロジェクトは、GitHubからダウンロードすることができます。
リソースの追加
新しいイメージを3つダウンロードする必要ですが。
完成したプロジェクトの /res/drawable/
にみると、 googleio
で始まるJPGファイル3つがあります。
このイメージをダウンロードして、自分のプロジェクトでは、同じ場所にファイルを追加してください。
そしてプロジェクトのリソース strings.xml
に以下の3つの文字列を追加してください。
/res/values/strings.xml
<resources>
...
<string name="io_title01">Keynote</string>
<string name="io_title02">Android: Open to the future</string>
<string name="io_title03">Wear OS by Google</string>
...
</resources>
最後に、 arrays.xml
を作成し、以下の文字列の配列を追加してください
/res/values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="spinner_entries">
<item >Android Dev Summit</item>
<item >Android I/O</item>
</string-array>
</resources>
スピナー定義
スピナーは、XMLレイアウトには、次のように定義することができます。
<Spinner
android:id="@+id/planets_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
私たちは、 entries
属性を追加して、activity_main.xml
にスピナーを定義します。
/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/spinner_entries"
android:paddingTop="10dp"
android:paddingBottom="10dp"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/list_item"/>
</LinearLayout>
ここでスピナーの entries
は@array/spinner_entries
を参照してますよ。スピナーのリストのリストを取得します。
このように、リソースのリストを管理することができます。
アプリをビルドして実行してみるとUIにスピナーが生成され、タッチしてみると、リソースの追加されたリストが出てくるのを見ることができます。
リスナーの登録
しかし、リストを選択てみても、画面は変わりません。リスナーを登録して、特定のリストを選択したときに、画面構成が異なることがあります。
Spinnerのリスナーは、次のコードのように登録することができます。その後、 onNothingSelected
とonItemSelected
のコールバックを受け取ることができます。
spinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
}
コードを少し変更して、 "Android Dev Summit"
を選択すると、Android Dev Summitの内容を示して
Android I/O
を選択すると、Android I / Oの内容を表示するように修正してみましょう。
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var adapter: RecyclerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val list = ArrayList<YoutubeItem>()
adapter = RecyclerAdapter(list)
recyclerView.adapter = adapter
recyclerView.addItemDecoration(
DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
spinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
Log.d("MainActivity",
"onItemSelected : $position, ${spinner.getItemAtPosition(position)}")
when (spinner.getItemAtPosition(position)) {
"Android Dev Summit" -> {
updateAndroidSubmit()
}
"Android I/O" -> {
updateGoogleIO()
}
else -> {
updateAndroidSubmit()
}
}
}
}
}
fun updateAndroidSubmit() {
val list = ArrayList<YoutubeItem>()
list.add(YoutubeItem(getDrawable(R.drawable.image01)!!, getString(R.string.title01)))
list.add(YoutubeItem(getDrawable(R.drawable.image02)!!, getString(R.string.title02)))
list.add(YoutubeItem(getDrawable(R.drawable.image03)!!, getString(R.string.title03)))
list.add(YoutubeItem(getDrawable(R.drawable.image04)!!, getString(R.string.title04)))
list.add(YoutubeItem(getDrawable(R.drawable.image05)!!, getString(R.string.title05)))
list.add(YoutubeItem(getDrawable(R.drawable.image06)!!, getString(R.string.title06)))
list.add(YoutubeItem(getDrawable(R.drawable.image07)!!, getString(R.string.title07)))
list.add(YoutubeItem(getDrawable(R.drawable.image08)!!, getString(R.string.title08)))
list.add(YoutubeItem(getDrawable(R.drawable.image09)!!, getString(R.string.title09)))
list.add(YoutubeItem(getDrawable(R.drawable.image10)!!, getString(R.string.title10)))
adapter.items = list
adapter.notifyDataSetChanged()
}
fun updateGoogleIO() {
val list = ArrayList<YoutubeItem>()
list.add(YoutubeItem(getDrawable(R.drawable.googleio01)!!, getString(R.string.io_title01)))
list.add(YoutubeItem(getDrawable(R.drawable.googleio02)!!, getString(R.string.io_title02)))
list.add(YoutubeItem(getDrawable(R.drawable.googleio03)!!, getString(R.string.io_title03)))
adapter.items = list
adapter.notifyDataSetChanged()
}
}
ビルドしてみると、コンパイルエラーが発生しますよ。 RecyclerViewのitemを private val
でvar
に変更するとエラーが解決されます。
RecyclerAdapter.kt
class RecyclerAdapter(var items: ArrayList<YoutubeItem>) :
....
ビルド後に実行しましょう。スピナーのリストを選択すると、UIが変更されることを確認することができます。
スピナーアダプタ
XMLでスピナーのエントリを設定せずに鼻間違ったコードで設定することができます。このような場合は、直接スピナーのアダプタを作成する必要があります。
val adapter = ArrayAdapter.createFromResource(
this,
R.array.spinner_entries, android.R.layout.simple_spinner_item
)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
まとめ
簡単にXMLでスピナー(Spinner)を生成する方法と、リスナーを登録して、リストに基づいて異なる動作をするように実装しました。 また、アダプタを作成して、スピナーを実装する方法を説明しました。
参考
- サンプルコードは、GitHubにあります
- Spinner - Android developer
Related Posts
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法