java - 如何获取用户在依赖微调器上选择的数据?
问题描述
我想做什么
我想获取用户在依赖微调器上选择的数据。
在我当前的代码中,已成功从第一个微调器获取数据,但我无法从第二个微调器获取数据。
问题
我应该如何修复我的代码以获取用户选择的适当数据?
- 在这种情况下,第二个 textView 应该是 BMW,但它是 Audi,它是第二个 spinner 的第一个候选者。
- 第一个 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<*>?) {
}
}
解决方案
请注意,每次选择移动设备(oa 电机)时,都会重新创建 spinner2。您应该为每个微调器使用不同的侦听器:
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
}
}
}
推荐阅读
- mocking - 如何验证链式方法调用?
- html - 无法更改 PWA Vuex 项目中的网站图标
- javascript - 验证用户数据和 jsonschema 时,我无法使用 Ajv 并在 javascript 中要求/编译
- css - 在单个 NgStyle 标签中混合多个条件?
- javascript - 如何在 HTML 中使用 INPUT 中的数据并将其应用于 Javascript 中的变量
- ios - UIDocumentPickerViewController 在选择文档后崩溃
- c# - 关于如何在尝试/捕获异常后忽略 for 循环中的文件的任何建议?
- oracle - Oracle Database 12c 中的 WITH 子句增强
- python - 使用本地文件远程运行 python 脚本
- reactjs - 如何在 react-router-dom 中正确定义后备路由