できたこと
Spinnerの簡単な実装と、Enumをうまく活用してみました!
Enumを使うことで、複数の定数を扱うことができて、コードもスッキリして見やすくできると思います。
具体的説明
Spinnerで選択された「選手名」をEnumから検索し、その選手のポジションをTextViewに反映させるというもの。
W杯でサッカーが盛り上がったのでサッカーのEnumにしちゃいました!
レイアウト
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/green">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:layout_centerHorizontal="true"
android:text="ポジション"
android:textColor="@color/black"
android:textSize="50sp"/>
<Spinner
android:id="@+id/spinner"
android:layout_width="200dp"
android:layout_height="50dp"
android:layout_below="@id/tv"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dp"
android:textAlignment="center"
android:background="@color/white"/>
</RelativeLayout>
ソースコード
MainActivityMainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tv : TextView = findViewById(R.id.tv)
val spinner : Spinner = findViewById(R.id.spinner)
val spinnerList : List<String> = listOf(
"南野拓実", "鎌田大地","長友佑都","川島永嗣",
)
// ここはほぼテンプレのようなもの。
// スピナーの中身(テキストサイズや背景など)を変更したい場合は、「R.layout.~~」を変更してください。
val adapter = ArrayAdapter(applicationContext, android.R.layout.simple_spinner_item, spinnerList)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
// Spinnerに中身が入っている時(今回はデフォルトで入っている状態)
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
// spinnerで選択した選手名を取得
val spinnerSelect = parent.selectedItem.toString()
// 上記を元にEnumに走り、Position取得
val playPosition = SoccerPlayerEnum.getEnumByPlayerName(spinnerSelect).position
// TextViewにPosition反映
tv.text = playPosition
}
// Spinnerの中身が空文字の時
override fun onNothingSelected(p0: AdapterView<*>?) {
// そのようなことはほぼほぼないので何も書かない
}
}
}
}
Enumクラス
SoccerPlayerEnum.kt
enum class SoccerPlayerEnum(val playerName: String, val position: String) {
// Enumでは大文字で書く
// 最後の定数の後は「;」
MINAMINO ("南野拓実", "FW"),
KAMADA ("鎌田大地", "MF"),
BRAVO ("長友佑都", "DF"),
KAWASHIMA("川島永嗣", "GK");
companion object {
// ここで選手名を取得する
fun getEnumByPlayerName(playerName: String): SoccerPlayerEnum =
values().find {
it.playerName == playerName
} ?: throw NotFoundException("エラー文")
// ここでポジションを取得する
fun getEnumByPosition(position: String): SoccerPlayerEnum =
values().find {
it.position == position
} ?: throw NotFoundException("エラー文")
}
}
応用として
getEnumByPositionでpositionの定数も取得することができるので、
positionを使ってみたり、定数を増やしてみたりしてうまく応用活用して見てください!