どうも!LSSです!
AndroidStudio+Kotlinで、アプリ開発の勉強中です!
今回は、Andoidアプリを作るのにほぼほぼ必須と思われるIntentについて書きます。
画面遷移?
Andoidアプリを作る際に、Activityってのを作って、それに関するコードを書いて…って感じで作っていきますが、Activityっていうのは何か?っていうと、
Activity=画面
でいいみたいです。
例として、簡単なゲームアプリを作るとして、
タイトル画面→メニュー画面→ゲーム画面→結果画面→メニュー画面に戻る
って感じの画面の流れがあったら、
- 「タイトル画面のActivity」
- 「メニュー画面のActivity」
- 「ゲーム画面のActivity」
- 「結果画面のActivity」
を用意して、切り替えていくって事になります。
その「切り替え」を行ってくれるのが、今回のネタIntentくんです!
ちなみに、その「切り替え」は「画面遷移」と呼ばれていますが、Androidの仕様上、実は遷移してるのではなく、「画面の上に別の画面を重ねてる」のが正しい表現になります。
つまり、「タイトル画面」から画面タップして「メニュー画面」が出てきた!と見えて、実は
「メニュー画面の下にタイトル画面が隠れてる状態」だったりするんですね。
で、スマホの◀(戻る)ボタンを押して「タイトル画面に戻った」ように見えて、実は
「タイトル画面の上にのっかっていたメニュー画面を破棄した」のが正しい表現だったりします。
コードはわずか2行でOK
val it0= Intent(this,MenuActivity::class.java )
startActivity(it0)
…以上です!(ちょっと::のあたりが、なんでこうなるか分かりませんが^^;。)
it0は任意の名前(好きに変えちゃってOK!な部分)、
MenuAcivityは呼び出すActivity(画面)の名前です。
例えばボタンのonClickでclkという関数を呼び出すとしたら、
fun clk(v: View){
val it0= Intent(this,MenuActivity::class.java )
startActivity(it0)
}
こんな感じに書く事で、「ボタンを押すとメニュー画面が出てくる」仕組みが実現します。
ふと思いついた実験と、その結果
Intentをネタに記事を書こうと思った時に、ふっと湧いた疑問があります。
「Intentで呼び出すActivityを、それが置かれているActivity自身にしたらどうなるんだろう?」
…という事で、さっそく試してみました!!
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun clk(v: View){
val it0= Intent(this,MainActivity::class.java )
startActivity(it0)
}
}
↑こういう感じですね。
AndroidStudioで新規プロジェクトを作成すると、デフォルトで作られるMainActivityに上記コードを書いて、画面にはボタンを一つ配置、そのonClickに「clk」と書いて、エミュレータで実行してみました!
すんなりコンパイルも通り、ボタンが一つだけの画面(1つめ)が出てきます。
ボタンを押すと、画面が切り替わったような演出の後、また同じ画面(2つめ)。
もう一度その画面のボタンを押すと、また同じ画面(3つめ)が出てきます。
画面が切り替わったような演出の後、また同じ画面(2つめ)。
もう一度◀を押すと、また同じ画面(1つめ)。
さらにもう一度◀を押すと、エミュレータスマホのデスクトップ?に戻りました。
うん、想定通りでしたが、やはりIntentで呼び出すと、
呼び出したActivityのインスタンス(複製)が作られて、
重ねて表示され、
同じActivityでもIntentで呼び出すたびに積み上げられて、
◀で上に積まれたActivityから順に破棄されていって、
最初のActivityで◀を押すとスマホのデスクトップが顔を出す、
という結果でした!
すっきり納得のいく結果で良かったですwww
では、今回はこのへんで!
次回もまた、よろしくです^^