【はじめてのKotlinプログラミング(8)】putExtra(値の受け渡し)

kotlinで、入力した値を次の画面に受け渡す方法について解説します。

前回intentで画面を遷移させる方法について解説しました。
今回はその続きで、
何かしら入力してもらって
入力させた値も受け渡す、ということをやってみましょう。

intentは画面を受け渡すんですが
画面の中の「値」を受け渡すのは、putExtraつーのを使います。

動画

コード

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
 
    <EditText
        android:id="@+id/et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Name"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="start"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et" />
</androidx.constraintlayout.widget.ConstraintLayout>

▼MainActivity.kt

package com.example.onamaeapp
 
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
 
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        val et:EditText =findViewById(R.id.et)
        val btnStart: Button = findViewById(R.id.btnStart)
 
        //1)画面遷移
        btnStart.setOnClickListener {
            val intent = Intent(this,SecondActivity::class.java)
 
            //2)値を渡す
            intent.putExtra("MY_NAME",et.text.toString())
 
            startActivity(intent)
        }
    }
}

▼activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="こんにちは"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="●●さん"
        android:textSize="34sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
 
    <Button
        android:id="@+id/btnBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="戻る"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvName" />
</androidx.constraintlayout.widget.ConstraintLayout>

▼SecondActivity.kt

package com.example.onamaeapp
 
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
 
class SecondActivity : AppCompatActivity() {
    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
 
        val tvName :TextView = findViewById(R.id.tvName)
        val btnBack:Button = findViewById(R.id.btnBack)
 
        // 3)渡された値を取り出す⇒テキストに表示
        val myName =intent.getStringExtra("MY_NAME")
        tvName.text =myName + "さん"
 
        //4)戻るボタン
        btnBack.setOnClickListener{
            finish()
        }
    }
}

テキスト

kotlinで、入力した値を次の画面に受け渡す方法について解説します。

前回intentで画面を遷移させる方法について解説しました。
今回はその続きで、
何かしら入力してもらって
入力させた値も受け渡す、ということをやってみましょう。

intentは画面を受け渡すんですが
画面の中の値を受け渡すのは
putExtraつーのを使います。

入力してもらった情報を
.putExtraで値を渡して、
厳密にはこっちでgetExtraで受け取るわけですが
受け取った値が、ここの●●さんのところに表示される、
というわけです。

例えばyamadaって入れたら
こんにちはyamadaさん、とかですね。

このように
intentとputExtra、厳密にはgetExtraも含めて
セットで使われることが多いので、是非頑張って覚えてください。

 

レイアウト

割愛

プログラミング

1)intent

それでは、ひとまず前回の復習がてら
Startボタンをおしたら
次の画面に移動するようにしてあげましょう。
画面遷移はintentでしたね。

まずはボタンのviewを取得します。
val et:EditText = findViewById(R.id.et)
val btnStart:Button = findViewById(R.id.btnStart)

で、このボタンを押した時の操作と、インテントを記述します。

//1)画面遷移
btnStart.setOnClickListener{
val intent = Intent(this,SecondActivity::class.java)
startActivity(intent)
}

これで画面遷移ができました。
いったんエミュレータを起動して確認してみましょう。

2)値を渡す

値を渡す、受け取る、というのを書いていきましょう。

ちなみにテンプレート的には
このように書きます。

———————————–

val 変数名 = “Hello!”
intent.putExtra(“KEY”,変数名)

val text = intent.getStringExtra(“KEY”)
データを受け取るときには、
型に合わせてgetStringなどを使います
———————————–

受け渡す方は
putExtraと書いてあげて、
KEYと変数をセットで渡します。

で受け取る側はgetExtraで、KEYを受け取ってあげると
それに紐づいている変数というか値を所得できる、という仕組みになっています。

データを受け取るときには、
型に合わせてgetStringなどを使います。
今回でいうとgetStringExtraですね。

ということで、フォーマットがわかったところで実際書いていきましょう。
↓↓↓

putExtra(name:キー, value:渡す値)
キーの名前は大文字で書くことが推奨されているので(正しくは)大文字・小文字関係ないです
MY_NAMEという名前を付けたい場合は
このようにしてあげます。

実際に渡す値は、
EditTextで入ってきたものなので
etとして
ちゃんと扱えるように変更してあげなければいけません。
で、これも以前やったと思いますが
文字の場合は
et.text.toString()
と書いてあげると、String、つまり文字になったので
別の工程でも扱えるようになりました。

あとは、遷移先で、この「MY_NAME」を受け取ってあげると
それに紐づいている値、今回でいうとetが表示される、ということになります。

 

3)値を受け取る

putExtraで値を渡したら
遷移先でgetExtraで受け取ってあげます。

second ktを開いてください。
で、お決まりではありますが、こちらもviewを取得しなければいけません。

// 3)渡された値を取り出す⇒テキストに表示
val myName = intent.getStringExtra(“MY_NAME”)
tvName.text = myName + “さん”

 

4)アクティビティの終了

finish()

 

5)エラー(注意メッセージ)解説

で、細かいエラーを一応説明しておきます。
ここの動画は基本、小綺麗に書くというより
とにかく動けばOKということで
小さいエラーは極力割愛させていただいているのですが。

Do not concatenate text displayed with setText. Use resource string with placeholders.
と表示されています。

文字列を連結しないで、stringファイルで定義してあげてください、とみたいなことを言っているようです。
まあ、具体的には
+ “さん”
のことですね。
例えばここを消せばエラーは消えます。

まあstringファイルは無視しているので、今までもこのように
注意は出ているんですが。

簡単な対応の仕方はですね、
ここの▼をクリックすると
何やら出てきて、それをクリックすると

@SuppressLint(“SetTextI18n”)
と追加されて
注意メッセージも消えました。

Lintっていうのが
問題点を指摘してくれる解析ツールのことなんですが
Suppressが抑える、控えるという意味なので
この中身はチェックしないでくださいね、という指示になります。

で、今回は18行目はチェックされないので、エラーも消えた、ということです。

まあ、こういうやり方もあるんだなという意味で紹介しておきます。

コメントを残す