##はじめに
今回は画面遷移と値の受け渡しについて実装していきます。
リストの各行に格納されている商品をアップすると画面が遷移し、
タップした商品が遷移先の画面に表示する機能を実装していきます。
##実装
<resources>
<string name="app_name">画面遷移サンプル</string>
<string name="tv_thx_title">注文完了</string>
<string name="tv_thx_desc">以下のメニューのご注文を受け付けました。御注文有り難う御座います。</string>
<string name="bt_thx_back">リストに戻る</string>
</resources>
まずstring.xmlファイルはこの様な感じ
続いてMainのxmlファイルはListViewを配置します
<?xml version="1.0" encoding="utf-8"?>
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lvMenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
##MainActivityの処理
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//画面部品ListViewを取得
val lvMenu = findViewById<ListView>(R.id.lvMenu)
//Simple Adapterで使用するMutableListオブジェクトを用意
val menuList : MutableList<MutableMap<String,String>> = mutableListOf()
//「食パン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
var menu = mutableMapOf("name" to "食パン","price" to "120円")
menuList.add(menu)
//「揚げパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
menu = mutableMapOf("name" to "揚げパン","price" to "130円")
menuList.add(menu)
//「ジャムパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
menu = mutableMapOf("name" to "ジャムパン","price" to "110円")
menuList.add(menu)
//「アンパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
menu = mutableMapOf("name" to "アンパン","price" to "130円")
menuList.add(menu)
//「カレーパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
menu = mutableMapOf("name" to "カレーパン","price" to "140円")
menuList.add(menu)
//「メロンパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
menu = mutableMapOf("name" to "メロンパン","price" to "150円")
menuList.add(menu)
//SimpleAdapter第4引数fromデータの用意
val from = arrayOf("name","price")
//SimpleAdapter第5引数データの用意
val to = intArrayOf(android.R.id.text1,android.R.id.text2)
//SimpleAdapterを生成
val adapter = SimpleAdapter(this@MainActivity,menuList,android.R.layout.simple_list_item_2,from,to)
//アダプタの登録
lvMenu.adapter = adapter
//リストタップのリスナラス登録
lvMenu.onItemClickListener = ListItemClickListener()
}
/>
商品名と金額をListViewのアダプターに格納します
//リストタップのリスナラス登録
lvMenu.onItemClickListener = ListItemClickListener()
上記をOnCreateメソッド内に記述する事でListViewのアイテムがタップされた時の処理が走る様になります
##ListItemClickListener
//リストがタップされた時の処理が記述されたメンバクラス
private inner class ListItemClickListener : AdapterView.OnItemClickListener{
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
//タップされた行のデータを取得。SimpleAdapterでは1行分のデータはMutableMap型
val item = parent.getItemAtPosition(position) as MutableMap<String,String>
//食品名と金額を取得
val menuName = item["name"]
val menuPrice = item["price"]
//インデントオブジェクトを生成
val intent2MenuThanks = Intent(this@MainActivity,MenuThanksActivity::class.java)
//第二画面に送るデータを格納
intent2MenuThanks.putExtra("menuName",menuName)
intent2MenuThanks.putExtra("menuPrice",menuPrice)
//第二画面の起動
startActivity(intent2MenuThanks)
}
}
詳しく見ていきます
val item = parent.getItemAtPosition(position) as MutableMap<String,String>
上記の記述でタップしたアイテムが何行目なのかと、食品名と金額を取り出しています
//第二画面に送るデータを格納
intent2MenuThanks.putExtra("menuName",menuName)
intent2MenuThanks.putExtra("menuPrice",menuPrice)
//第二画面の起動
startActivity(intent2MenuThanks)
上記ではタップしたアイテムの食品名と金額を遷移先のActivityに渡そうとしています。
そして、startActivity(intent2MenuThanks)で遷移先に処理が流れます
##遷移先のActivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@string/tv_thx_title"
android:gravity="center"
android:textSize="25sp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@string/tv_thx_desc"
android:textSize="15dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvMenuName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:id="@+id/tvMenuPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onBackButtonClick"
android:text="@string/bt_thx_back"/>
</LinearLayout>
この画面では食品名と金額の表示やMain画面に戻るボタンが表示
class MenuThanksActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_menu_thanks)
//リスト画面から渡されたデータを取得
val menuName = intent.getStringExtra("menuName")
val menuPrice = intent.getStringExtra("menuPrice")
//食品名と金額を表示させるTextViewを取得
val tvMenuName = findViewById<TextView>(R.id.tvMenuName)
val tvMenuPrice = findViewById<TextView>(R.id.tvMenuPrice)
//TextViewに食品名と金額を表示
tvMenuName.text = menuName
tvMenuPrice.text = menuPrice
}
//戻るボタンをタップした時の処理
fun onBackButtonClick(view: View){
finish()
}
}
上記では食品名と金額を遷移前のActivityから受け取っている処理や
受け取った食品名と金額を表示、それからボタンを押すとMainの画面に戻る処理が記述されています。
##さいごに
仕事でJavaを扱っていますが、やっぱKotlinめちゃめちゃいいですね〜、、
個人的にアプリ開発していますが、楽しすぎて時間を忘れてしまい、画面眩しいからはよ寝ろと嫁に怒られアセアセ(汗)
皆さん、家族サービスも忘れずに、、、。