63072


### 実現したいこと

Kotlinでプルダウン(spinner)を2つ作成し、2つ目のプルダウン表示を1つ目の選択によって変更する機能を実装しようとしています。

Stackoverflowに同様の実装方法に関する質問があり、[how to make spinner depends on another
spinner](https://stackoverflow.com/questions/29474829/how-to-make-spinner-
depends-on-another-spinner)のコードをまず動かすことに挑戦しています。

### 問題

[how to make spinner depends on another
spinner](https://stackoverflow.com/questions/29474829/how-to-make-spinner-
depends-on-another-spinner)では、KotlinではなくJavaで書かれていたコードだったので、Android
Studioに書き込むと自動でKotlinのコードに翻訳されました。

しかし、ビルドするとエラーが表示され、「2つ目のプルダウン表示を1つ目の選択によって変更する」実装をエミュレータで確認できるようにするにはどのように修正すればいいのかわからず困っています。

検索でも、「２つ目のプルダウン表示を1つ目の選択によって変更するプログラム」のKotlinプログラムを見つけられておらず、質問させていただきました。

## エラーメッセージ

[code]

    class 'MainActivity' is not abstract and does not implement abstract member
    'onCreateOptionsMenu' hides member of supertype and needs 'override' modifier
    'onOptionsItemSelected' hides member of supertype and needs 'override' modifier
    
[/code]

MainActivity.kt  
ライン 15, 33, 39 より抜粋、**で囲んでいる部分が赤線が出てエラーメッセージが吹き出しで表示される箇所です。

[code]

    **class MainActivity** : Activity(), OnItemSelectedListener {
    ...
        fun **onCreateOptionsMenu**(menu: Menu): Boolean {
            // Inflate the menu; this adds items to the action bar if it is present.
            menuInflater.inflate(R.menu.main, menu)
            return true
        }
    
        fun **onOptionsItemSelected**(item: MenuItem): Boolean {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            val id = item.getItemId()
            return if (id == R.id.action_settings) {
                true
            } else super.onOptionsItemSelected(item)
        }
    ...
    
[/code]

### 実行しているコード

MainActivirt.kt

[code]

    package com.example.twospinners
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.AdapterView
    import android.R
    import android.widget.ArrayAdapter
    import android.widget.Toast
    import androidx.test.core.app.ApplicationProvider.getApplicationContext
    import android.widget.Spinner
    import android.widget.AdapterView.OnItemSelectedListener
    import android.app.Activity
    
    class MainActivity : Activity(), OnItemSelectedListener {
    
        internal lateinit var spinner1: Spinner
        internal lateinit var spinner2: Spinner
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            spinner1 = findViewById(R.id.spinner1) as Spinner
            spinner2 = findViewById(R.id.spinner2) as Spinner
            val adapter1 = ArrayAdapter.createFromResource(
                this,
                R.array.array1, android.R.layout.simple_spinner_item
            )
            spinner1.adapter = adapter1
            spinner1.onItemSelectedListener = this
        }
    
        fun onCreateOptionsMenu(menu: Menu): Boolean {
            // Inflate the menu; this adds items to the action bar if it is present.
            menuInflater.inflate(R.menu.main, menu)
            return true
        }
    
        fun onOptionsItemSelected(item: MenuItem): Boolean {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            val id = item.getItemId()
            return if (id == R.id.action_settings) {
                true
            } else super.onOptionsItemSelected(item)
        }
    
        fun onIemSelected(
            parent: AdapterView<*>, view: View, position: Int,
            id: Long
        ) {
            if (spinner1.selectedItem == "mobile") {
                Toast.makeText(
                    applicationContext, "Mobil dipilih",
                    Toast.LENGTH_SHORT
                ).show()
    
                val adapter2 = ArrayAdapter.createFromResource(
                    this,
                    R.array.mobile_array, android.R.layout.simple_spinner_item
                )
                spinner2.adapter = adapter2
            } else {
                val adapter2 = ArrayAdapter.createFromResource(
                    this,
                    R.array.motor_array, android.R.layout.simple_spinner_item
                )
                spinner2.adapter = adapter2
            }
    
        }
    
    
        override fun onNothingSelected(parent: AdapterView<*>) {
            // TODO Auto-generated method stub
        }
    
    }
    
    
[/code]

activity_main.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.stackspinner.MainActivity" >
    
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <Spinner
            android:id="@+id/spinner2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/spinner1" />
    
    </RelativeLayout>
    
[/code]

strings.xml

[code]

    <resources>
    
        <string name="app_name">Application Name</string>
        <string name="hello_world">Hello world!</string>
        <string name="action_settings">Settings</string>
    
        <string-array name="array1">
            <item>mobile</item>
            <item>motor</item>
        </string-array>
        <string-array name="mobile_array">
            <item>Android</item>
            <item>blackberry</item>
            <item>apple</item>
        </string-array>
        <string-array name="motor_array">
            <item>Audi</item>
            <item>BMW</item>
            <item>unicorn</item>
        </string-array>
    </resources>
    
[/code]

### ご回答を受けて行ったこと

[![画像の説明をここに入力](https://i.stack.imgur.com/rjEBX.png)](https://i.stack.imgur.com/rjEBX.png)

`menu/main.xml`を`res`フォルダ配下に置いたのですが、MainActivity.ktで

[code]

    Menu
    MenuItem
    
[/code]

が`unresolved reference`となってしまい、実行できない状況です。

### 開発環境

Android Studio 3.5.3

Emulator Pixel2 API 28

OS 4.4 KitKat


CC BY-SA 4.0
2020-02-15T08:44:44.647
63065
2020-02-15T13:41:11.363
2020-02-15T13:34:23.873
question
java android android-studio xml kotlin
Kotlinでプルダウン(spinner)を2つ作成し、2つ目のプルダウン表示を1つ目の選択によって変更するプログラムのエラー


こんにちは、はじめまして  
動作確認しました。本家の例からはmenu/main.xmlとvalues/dimens.xmlが抜け落ちてますね。付け加えましょう。エラーメッセージは、継承してオーバーライドしているメソッドなので関数の宣言に`override`がないことを指摘されています。  
あとはSafetyCallの書き方くらいですかね違いは。自動変換はとても便利ですが、一気にコピペせずにメソッド単位で変換内容を見ながら試すよう私はしています。

MainActivity.ktとそれ以外のファイルは以下になります。すでに提示されているファイルは同様の内容になっています。

**追記** (15/Feb 22:37):  
Toastやメニューについてですが、基本的には参照が解決されていないためエラーが表示されています。赤字の出てる箇所をポイントして`Alt+Enter`を入力するとAndroidStudioが解決の候補を出してくれます。クラスを利用するにはファイルの冒頭でimportが必要になります。私のimportは以下のようになっています。AndroidStudioでは自動で追加されますので、このあたりはたまに手動で最適化するのがよいでしょう。

[code]

    import android.os.Bundle
    import android.view.Menu
    import android.view.MenuItem
    import android.view.View
    import android.widget.AdapterView
    import android.widget.ArrayAdapter
    import android.widget.Spinner
    import android.widget.Toast
    import androidx.appcompat.app.AppCompatActivity
    
[/code]

個々のクラスの内容についてはAPIドキュメントを見ていただくのが最終的にはよいのですが簡単に説明すると以下のようになります

Toast: Androidで短時間情報を表示するために用いられる小さな画面要素。近年非推奨となっていますが特に利用に問題はないです  
Menu,MenuItem:
Menuは画面メニュー、MenuItemは画面メニューの一項目を表します。オプションメニューやそのほかいくつかの場所で利用されます

[code]

    class MainActivity : AppCompatActivity(), AdapterView.OnItemSelectedListener {
    var spinner1: Spinner? = null
    var spinner2: Spinner? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        spinner1 = findViewById(R.id.spinner1) as Spinner
        spinner2 = findViewById(R.id.spinner2) as Spinner
        val adapter1 = ArrayAdapter.createFromResource(
            this,
            R.array.array1, android.R.layout.simple_spinner_item
        )
        spinner1?.setAdapter(adapter1)
        spinner1?.setOnItemSelectedListener(this)
    }
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the main; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.main, menu)
        return true
    }
    
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        val id = item.getItemId()
        return if (id == R.id.action_settings) {
            true
        } else super.onOptionsItemSelected(item)
    }
    
    override fun onItemSelected(
        parent: AdapterView<*>, view: View, position: Int,
        id: Long
    ) {
        if (spinner1?.getSelectedItem() == "mobile") {
            Toast.makeText(
                applicationContext, "Mobil dipilih",
                Toast.LENGTH_SHORT
            ).show()
    
            val adapter2 = ArrayAdapter.createFromResource(
                this,
                R.array.mobile_array, android.R.layout.simple_spinner_item
            )
            spinner2?.setAdapter(adapter2)
        } else {
            val adapter2 = ArrayAdapter.createFromResource(
                this,
                R.array.motor_array, android.R.layout.simple_spinner_item
            )
            spinner2?.setAdapter(adapter2)
        }
    
    }
    override fun onNothingSelected(parent: AdapterView<*>?) {
    
    }
    }
    
[/code]

menu/main.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/action_settings"
            android:title="test" />
    </menu>
    
[/code]

dimens.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="activity_vertical_margin">10dp</dimen>
        <dimen name="activity_horizontal_margin">10dp</dimen>
    </resources>
    
[/code]


CC BY-SA 4.0
2020-02-15T12:46:26.373
63072
2020-02-15T13:41:11.363
2020-02-15T13:41:11.363
37777
37777
63065
answer