【问题标题】:How can I aquire data that a user selected on dependent spinner?如何获取用户在依赖微调器上选择的数据?
【发布时间】:2020-03-05 23:33:35
【问题描述】:

我想做的事

我想获取用户在依赖微调器上选择的数据。

在我当前的代码中,成功从第一个微调器获取数据,但我无法从第二个微调器获取数据。

问题

我应该如何修复我的代码以获取用户选择的适当数据?

  1. 在这种情况下,第二个 textView 应该是 BMW,但它是 Audi,它是第二个 spinner 的第一个候选者。

  1. 第一个 textView 在用户选择后发生更改。在这种情况下,它从 motor 变为 mobile,但同样,第二个 textView 仍然是第二个 spinner 的第一个候选者。

当前代码

MainActivity.kt

package com.example.spinner

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.app.Activity
import android.content.Intent
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.Spinner
import android.widget.ArrayAdapter
import kotlinx.android.synthetic.main.activity_main.*
import android.widget.AdapterView.OnItemSelectedListener
import android.widget.Toast

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)
            spinner2?.setOnItemSelectedListener(this)

        } else {
            val adapter2 = ArrayAdapter.createFromResource(
                this,
                R.array.motor_array, android.R.layout.simple_spinner_item
            )
            spinner2?.setAdapter(adapter2)
            spinner2?.setOnItemSelectedListener(this)

        }


        // here I try to put the selected contents to variables
        val spinner1_content = spinner1?.getSelectedItem() as String
        textView1.text = spinner1_content
        val spinner2_content = spinner2?.getSelectedItem() as String
        textView2.text = spinner2_content


    }


    override fun onNothingSelected(parent: AdapterView<*>?) {

    }
}

activity_main.xml

<?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" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#00f"
        android:layout_marginTop="100dp"
        android:textSize="40sp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#00f"
        android:layout_marginTop="100dp"
        android:textSize="40sp" />

    </LinearLayout>

</RelativeLayout>

字符串.xml

<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>

听到答案后的当前代码

MainActivity.kt

package com.example.spinner

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.app.Activity
import android.content.Intent
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.Spinner
import android.widget.ArrayAdapter
import kotlinx.android.synthetic.main.activity_main.*
import android.widget.AdapterView.OnItemSelectedListener
import android.widget.Toast

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)

        val adapter2 = ArrayAdapter.createFromResource(
            this,
            R.array.array1, android.R.layout.simple_spinner_item
        )
        spinner2?.setAdapter(adapter2)
        spinner2?.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)

        }


        // here I try to put the selected contents to variables
        val spinner1_content = spinner1?.getSelectedItem() as String
        textView1.text = spinner1_content
        val spinner2_content = spinner2?.getSelectedItem() as String
        textView2.text = spinner2_content


    }


    override fun onNothingSelected(parent: AdapterView<*>?) {

    }
}

【问题讨论】:

  • 您从未在 onCreate 方法中向 spinner2 添加适配器或侦听器。
  • 感谢您的评论。你能用代码解释一下它的细节吗?我可以看到 spinner2 的变化取决于选定的 spinner1,用户可以选择 spinner2 上的每个元素。
  • 您在代码中的任何地方都没有调用spinner2?.setOnItemSelectedListener,因此当您在spinner2 中选择项目时不会发生任何事情。
  • 我已将 MainActivity.kt 更改为 spinner2?.setOnItemSelectedListener 但在这种情况下,当我更改第一个微调器时,应用程序在模拟器上关闭,第二个微调器的 textView 也没有改变.
  • 堆栈跟踪会告诉你它为什么会崩溃。至于您的逻辑,由于两个微调器都使用相同的侦听器,因此您需要通过使用 parent 的值来区分哪一个刚刚被更改。喜欢when(parent) { spinner1 -&gt; { /* logic for spinner 1 */ } spinner2 -&gt; { /* logic for spinner2 */ } }

标签: java android xml kotlin spinner


【解决方案1】:

请注意,每次选择移动设备(或电机)时,都会重新创建微调器2。您应该为每个微调器使用不同的侦听器:

spinner1.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {

            }

            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
              //your spinner1 listener code
            }

        }

spinner2.dothesame.....

为了更好的理解,我把整个 onCreate:

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
    textView1 = findViewById(R.id.textView1) as TextView
    textView2 = findViewById(R.id.textView2) as TextView

    val adapter1 = ArrayAdapter.createFromResource(
            this,
            R.array.array1, android.R.layout.simple_spinner_item
    )
    spinner1?.setAdapter(adapter1)
    spinner1?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {

        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {


            var spinner2Adapter: ArrayAdapter<CharSequence>? = null
            //select the right adapter for de Spinner2
            if (spinner1?.getSelectedItem() == "mobile") {
                spinner2Adapter = ArrayAdapter.createFromResource(
                        applicationContext,
                        R.array.mobile_array, android.R.layout.simple_spinner_item
                )
            } else {
                spinner2Adapter = ArrayAdapter.createFromResource(
                        applicationContext,
                        R.array.motor_array, android.R.layout.simple_spinner_item
                )
            }
            //set the adapter and the listener for spinner2
            spinner2?.setAdapter(spinner2Adapter)
            spinner2?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) {

                }

                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    val spinner2_content = spinner2?.getSelectedItem() as String
                    textView2?.text = spinner2_content

                }
            }


            // here I try to put the selected contents to variables
            val spinner1_content = spinner1?.getSelectedItem() as String
            textView1?.text = spinner1_content
        }

    }
}

【讨论】:

  • 感谢您的回答,但仍然不清楚我可以在哪里实现它。我已经上传了我当前的代码,但它不起作用。您能否在每个列表器实现之前和之后发布包含代码?
  • 对不起,我没有解释清楚。在 onCreate 方法中,将spinner1?.setOnItemSelectedListener(this) 替换为我输入的代码。并以同样的方式设置 spinner2 监听器。您不再需要 onItemSelected 函数
  • 感谢您提供更多信息。我按照你的解释更新了我当前的代码,但在这种情况下,应用程序没有在模拟器上启动(自动关闭)。
  • ``` val adapter2 = ArrayAdapter.createFromResource( this, R.array.array1, android.R.layout.simple_spinner_item ) spinner2?.setAdapter(adapter2) spinner2?.setOnItemSelectedListener(this) } ` ``
  • 你能用spinner1.onItemSelectedListener = object : AdapterView.OnItemSelectedListener语句前后的代码解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多