【Android】画面遷移をするには

■ はじめに

https://dk521123.hatenablog.com/entry/2013/09/25/002349

の続き。
ボタン押下イベントの後は、画面遷移について、学ぶ。

■ 画面遷移をするには...

色々な方法があると思うが、今回は、以下の方法について扱う 

【1】Intentを利用する
【2】Kotlinライブラリ Anko を利用する

Anko について

* Kotlinライブラリ Anko を利用する方法は、
 Anko が非推奨になっている...

https://github.com/Kotlin/anko/blob/master/GOODBYE.md

【1】 Intentを利用する

Intent(インテント)とは?

 * アクティビティなどが、他のアクティビティやアプリケーションなどと
   情報のやり取りを行うためのクラス

 サンプル / Kotlin

デザイン部

 * 画面を追加する([File]-[New]-[Activity]-[Empty Activity]で追加)
  + 「activity_main.xml」(メイン画面)
  + 「activity_sub1.xml」 (サブ画面)
 * 書く画面に button x 1を追加

プログラム部 / MainActivity.kt

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // ★ここ★
        button.setOnClickListener {
            val intent1 = Intent(
                this, SubActivity1::class.java)
            startActivity(intent1)
        }
    }
}

補足:ボタン・OnClickプロパティ

* ボタンのみ、OnClickプロパティに指定したメソッドから
 以下のようにも書ける

サンプル

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AbsListView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import com.dk.myfirstapplication.SubActivity1 as SubActivity11

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    // ★デザインで onClickプロパティに「onClick」を追加しておく ★
    fun onClick(view: View) {
        val intent1 = Intent(
            this, SubActivity11::class.java)
        startActivity(intent1)
    }
}

 サンプル / Java

デザイン部

 * 画面を追加する
  + 「activity_main.xml」(メイン画面)
  + 「activity_sub.xml」 (サブ画面)
 * 書く画面に button x 1を追加

プログラム部 / MainActivity.java

package com.example.androidhelloworld;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
  private Button button1;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.button1 = (Button) findViewById(R.id.button1);
    this.button1.setOnClickListener(this);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
      // インテントのインスタンス生成
      Intent intent = new Intent(MainActivity.this, SubActivity.class);
      // 次画面のアクティビティ起動
      startActivity(intent);
      break;
    }
  }
}

プログラム部 / SubActivity.java

package com.example.androidhelloworld;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SubActivity extends Activity implements OnClickListener {

  private Button button1;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub);
    this.button1 = (Button) findViewById(R.id.button1);
    this.button1.setOnClickListener(this);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
      // インテントのインスタンス生成
      Intent intent = new Intent(SubActivity.this, MainActivity.class);
      // 次画面のアクティビティ起動
      startActivity(intent);
      break;
    }
  }
}

その他 / AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidhelloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.androidhelloworld.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- ↓追加行↓ -->
        <activity android:name=".SubActivity" android:label="@string/app_name"/>
        <!-- ↑追加行↑ ->
    </application>
</manifest>

【2】 Ankoを利用する

 * たった一行「startActivity<【移動したクラス】>()」で済む

 初期設定

[1] 「./build.gradle」に「ext.anko_version = '【バージョン ※】'」を追記し、
    「./app/build.gradle」に「implementation "org.jetbrains.anko:anko:$anko_version"」を追記する

※ 【バージョン】は、以下のサイトから最新版を確認(今回は「0.10.5」)

https://github.com/Kotlin/anko

[2] Android Studioの[File]-[Sync Project with Gradle Files]を選択し、 Anko をダウンロードする

./build.gradle

buildscript {
    ext.kotlin_version = '1.2.50'
    ext.anko_version = '0.10.5' // ★ Add ★

./app/build.gradle

implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation "org.jetbrains.anko:anko:$anko_version" // ★ Add ★

サンプル / Kotlin

デザイン部

 * 画面を追加する
  + 「activity_main.xml」(メイン画面)
  + 「activity_sub.xml」 (サブ画面)
 * 書く画面に button x 1を追加

プログラム部 / MainActivity.kt

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.startActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        moveSubButton.setOnClickListener {
            // ★ここに注目★
            startActivity<SubActivity>()
        }
    }
}

プログラム部 / SubActivity.kt

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_sub.*
import org.jetbrains.anko.startActivity

class SubActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)

        moveMainbutton.setOnClickListener {
            // ★ここに注目★
            startActivity<MainActivity>()
        }
    }
}

参考文献

【1】 Intentを利用する
http://androidhacker.blog94.fc2.com/blog-entry-24.html
http://androidhacker.blog94.fc2.com/blog-entry-26.html
http://wiki.livedoor.jp/moonlight_aska/d/%B2%E8%CC%CC%A4%F2%C1%AB%B0%DC%A4%B9%A4%EB
http://www.techfirm.co.jp/lab/android/transition.html

関連記事

ボタンイベントを処理するには
https://dk521123.hatenablog.com/entry/2013/09/25/002349
別画面への値の受け渡し
https://dk521123.hatenablog.com/entry/2013/09/27/230328
スワイプして 画面遷移 をするには
https://dk521123.hatenablog.com/entry/2019/09/30/020307