
MainActivityではintentによる画面遷移をするときにSetonclicklistenerを定義していないのにもかかわらず、button.setOnClickListenerとやるとエラーにはなりませんでした。
しかし、Secondactivityでも同様にSetonclicklistenerを定義せずに使おうとするとエラーが出てしまいました。
どのようにしたら、SecondactivityでもSetonclicklistenerを使えるようになりますか?
ぜひ回答の方のよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

2019/01/19 05:41

回答1件
0
ベストアンサー
これを理解するには、まずKotlin Android Extensionsを理解する必要があります。
activity_main.xmlというレイアウトXMLファイルで
xml
1 <Button 2 android:id="@+id/button" 3 />
のように記述をすると、Kotlinソースファイルでは
kotlin
1import kotlinx.android.synthetic.main.activity_main.*
というimport文を挿入することで、
kotlin
1 button.text = "finish" 2 button.setOnClickListener { 3 finish() 4 }
のように、findViewById()を用いずともXMLに記述したID名を変数として用いることができます。
これがKotlin Android Extensionsの主な機能です。この拡張機能を使うには、build.gradleへの記述も必要になるのですが、言語にKotlinを選択して新規プロジェクト作成するとその辺りの設定は予め行われているので、ユーザーは気にする必要はありません。ただし、Javaを選択して作成したプロジェクトで、後からKotlinソースファイルを追加したいようなときは、拡張機能の追加も手作業で行う必要があります。
setOnClickListenerはButtonクラスに属するメソッドです。ですから、変数がButton型でなければ使えません。上記のKotlinコードでは、buttonという変数がButton型として扱われているためにsetOnClickListenerを用いることができます。
ここからが主題ですが、エラーになっているコードを見ると
kotlin
1import e.masaya.myapplication.R.string.button2
というimport文が見られます。これは、恐らくres/values/strings.xmlの中に
xml
1 <string name="button2">button2</string>
のような記述をされているのだろうと思います(ボタンのラベルとするため?)。しかし、このような状況で前述のimport文を記述すると、このstrings.xmlの情報を参照しようとしてしまうため、コンパイラーはbutton2という名前をe.masaya.myapplication.R.string.button2という完全修飾名の変数として扱い、Buttonコンポーネントとして取り扱ってくれません(R.xxx.yyyの形式で表現されるのは全てint型変数です)。そのためにエラーとなっています。
button.setOnClickListener
ではエラーにならなかったとのことですが、これはレイアウトXMLファイルにbuttonというIDを付けたコンポーネントが存在していたからではありませんか?
Activityのど真ん中に置いたボタンにbutton2というIDを付けて、このボタンを押したときにSecondActivityに遷移するコードです。なお、Kotlinコードからは1行目のpackage文だけ除いています。
xml
1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <Button 10 android:id="@+id/button2" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="Button" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toEndOf="parent" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18</android.support.constraint.ConstraintLayout>
kotlin
1import android.content.Intent 2import android.os.Bundle 3import android.support.v7.app.AppCompatActivity 4import kotlinx.android.synthetic.main.activity_main.* 5 6class MainActivity : AppCompatActivity() { 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 12 button2.setOnClickListener { 13 val intent = Intent(this, SecondActivity::class.java) 14 startActivity(intent) 15 } 16 } 17}
本当はこういう丸写しで解決できてしまう回答をすることは、私が他の回答者から邪道だと言われても仕方ないものだということをご理解くださいね。本来、最初の回答で初心者であっても理解できなければならない内容のはずです。
投稿2019/01/19 05:53
編集2019/01/21 10:25総合スコア6768
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。