質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2102閲覧

OnTabSelectedListenerにコンストラクタは必要ないはずなのに"does not have constructors"というエラーが出てる

gitboku

総合スコア32

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/02/11 06:31

編集2018/02/11 07:25

前提・実現したいこと

アンドロイドアプリの開発をしております。
そのアプリのUIにはタブがあり、TabLayoutを用いてタブの機能を実現しようとしています。
作成したタブにOnTabSelectedListenerを追加し「どのタブが選択されているかによって表示するものを変える」という機能を実装しようとしています。
しかし、OnTabSelectedListenerにコンストラクタは必要ないはずなのに"Interface OnTabSelectedListener does not have constructors"というエラーが出てしまいます。

質問内容

  • どうやったら"Interface OnTabSelectedListener does not have constructors"のエラーはなくなりますか?
  • 自分はOnTabSelectedListenerにコンストラクタは必要ないはずなのに、なぜこのエラーは出たのでしょうか?
  • 「タブごとに異なる表示をする機能をリスナーを用いて実装する」というのは実装方針として正しいですか?

 (リスナーは「タブが選ばれた時に音を鳴らす」といった用途に用いるものであり、「タブが選ばれたら異なるFragmentを表示する」のは全く別の話なのでは?という疑問が出てきました)

該当のソースコード

kotlin

1import android.os.Bundle 2import android.support.design.widget.TabLayout 3import android.support.v7.app.AppCompatActivity 4import android.widget.FrameLayout 5 6class MainActivity : AppCompatActivity() { 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 12 var tabLayout = findViewById<TabLayout>(R.id.tabs) 13 var frameLayout = findViewById<FrameLayout>(R.id.tabContent) 14 15 tabLayout.addTab(tabLayout.newTab().setText(R.string.tab_calender)) 16 tabLayout.addTab(tabLayout.newTab().setText(R.string.tab_stack)) 17 18 // ↓の行の"OnTabSelectedListener"のところに赤い波線が出ています。 19     // エラー文は"Interface OnTabSelectedListener does not have constructors"です。 20 tabLayout.addOnTabSelectedListener(TabLayout.OnTabSelectedListener { 21 fun onTabSelected(tab: TabLayout.Tab) { 22 println("hello") 23 } 24 }) 25 } 26}

bundle.gradleのdependenciesは以下の通りです。

dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:support-v4:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' compile 'com.android.support:appcompat-v7:23.1.0' // addOnTabSelectedListenerはcom.android.support:design:27.0.0 compile 'com.android.support:design:27.0.0' }

補足情報(FW/ツールのバージョンなど)

Android Studio 3.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

"Interface OnTabSelectedListener does not have constructors"というエラーが出てしまいます。

これは記述方法の誤りでは。

× tabLayout.addOnTabSelectedListener(TabLayout.OnTabSelectedListener { ○ tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {

また、それを解消しても尚エラーになるでしょう。これは、OnTabSelectedListenerはonTabSelected()、onTabUnselected()、onTabReselected()という3つのメソッドの実装が必須とされるからです。

tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { } override fun onTabUnselected(tab: TabLayout.Tab) { } override fun onTabReselected(tab: TabLayout.Tab) { } })

のように書く必要があるかと思います。

投稿2018/02/11 07:56

編集2018/02/11 08:00
keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gitboku

2018/02/11 11:59

ありがとうございます、エラーがなくなりました! Kotlinのラムダ式とか無名クラスに関する知識が不足していたようです。 あと、「インターフェースのメソッドはすべて実装する必要がある」という認識も忘れてました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問