Activityの画面遷移
KotlinでActivityの画面遷移を勉強します。
- メイン側「Activity-Activity-Transit」と書かれたアクティビティから、サブ側「SubActivity」と書かれたアクティビティに遷移させます。
- 遷移に際して、文字データをSub側におくります。
メイン側 (送り手)
今回の教科書の[Kotlin de Android] 画面遷移をしてみようを参考にされて、画面は作成してみてください。ちなみにプロジェクト名が「Activity_Activity_Transit」にしたので、長くなってますが、ご容赦ください。
ポイントは3つ
- ① Kotlinではstatic(定数)は書けないので、companion objectで書く。これはのちにIntentでデータを渡す際に使用する。(*注 com.exampleで一致させておくほうが良いかも。。勢いコード書いたので。)
- ② 本質とは関係ないがデータが入力されていなかった場合に、注意を出すためのコードです。
- ③ Activity間でデータを共有する際に使用する仕組み「Intent」を作成して、送り先のクラス”SubActivity::class.java”を指定して、putExtraでセット。startActivity(intent)で遷移先の画面を起動する。
package com.example.activity_activity_transit import android.content.Intent import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { // ①データを送付するためのアドレス companion object { const val EXTRA_TEXTDATA = "com.office-fun.Activity_Activity_Transit.TEXTDATA" } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { //② データ入力がなかった場合の注意を提起 if (editText.text.toString() == "") { editText.error = "データを入力してください" } else { // SubActivityの開始 // ③-1 Intentでデータを共有 val intent = Intent(this, SubActivity::class.java) intent.putExtra(EXTRA_TEXTDATA, editText.text.toString()) // ③-2 SubActivityを起動 startActivity(intent) } } } }
②の実際にデータが入力されていなかった場合の注意の出方
こんな感じで出ます。結構有用かも。
Intentについて
Intentは他のアプリとのデータの共有にも使用する仕組みなので重要。「インテントとインテント フィルタ」など、「Android Intent」などで一通り目を通しておく。(自分に向けて)
サブ側 (受け手)
ポイントは3つ
本筋は②のIntentでのデータの受けとる部分です。
- ① アクションバーをこのような形で追加できます。(Sub側であることがわかりにくいのと、戻る機能を追加したいため)
- ② companion objectで作成したEXTRA_TEXTDATAで指定して、データを取得する。
- ③ アクションバーの動作はこのように書く。戻るボタンのIDは android.R.id.home が割り当てられており、その場合はActivityを終了させて、return trueで戻る。それ以外は親の処理にお任せ。
package com.example.activity_activity_transit import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.view.MenuItem import kotlinx.android.synthetic.main.activity_sub.* class SubActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_sub) // ①ActionBarの追加 supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.title = "SubActivity" // ②データを受け取る textView.text = intent.getStringExtra(MainActivity.EXTRA_TEXTDATA) } // ③ActionBarの動作 override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { android.R.id.home -> finish() else -> return super.onOptionsItemSelected(item) } return true } }
ActionBarと戻るボタン
コードだけで意外に簡単に追加できたので、覚えておきたい。
Kotlin 文法もやっぱり重要
結構、C#からののりそのままで、いろいろなサイト・Javaのサイトを勉強しながら来ているが、文法は勉強していないので、”?”とかが来ると私の頭が「?」とかになる。落ち着いて調べてみた。
「Kotlin文法 – this、等価性、演算子オーバーロード、Null安全、例外」で勉強させてもらったが、そのなかにある、「Null安全」「Nullable型とNullにならない型」が大変勉強になった。
“supportActionBar?.setDisplayHomeAsUpEnabled(true)”となっているので、supportActionBarがnullableなんですねとかがわかる。文法はぼちぼち勉強していきたい。
参考にさせてもらったサイト
Kotlinで勉強しようとすると意外にまだサイトがなくて、いろいろなサイトを参考にさせてもらっています。参考になります。
usacoさんの[Kotlin de Android] 画面遷移をしてみようを実際にKotlinで行ってみました。
KotlinではStaticは書けないので、objecctとcompanion objectで書く。ここも参照。
インテントについては様々な解説があるので、ある程度「Android Intent」で検索してよんでおくと参考になる。
Sub側から戻すときは、[Android] アプリの画面遷移とActivity間のデータ転送で、戻すこと。