当所选项目更改时,如何设置 Spinner 的事件侦听器?
基本上我想做的是类似于这样的事情:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
之前的一些答案是不正确的。它们适用于其他小部件和视图,但 Spinner widget 的文档明确指出:
微调器不支持项目单击事件。调用此方法将引发异常。
最好改用 OnItemSelectedListener():
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// your code here
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
这对我有用。
请注意,在构建视图时也会调用 onItemSelected 方法,因此您可以考虑将其放在 onCreate()
方法调用中。
Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);
spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// Your code here
}
public void onNothingSelected(AdapterView<?> adapterView) {
return;
}
});
注意:记住一件事。
Spinner OnItemSelectedListener
事件将执行两次:
微调器初始化 用户手动选择
尝试通过使用标志变量来区分这两者。
您可以在 Activity 中实现 AdapterView.OnItemSelectedListener
类。
然后在 onCreate()
中使用以下行
Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
然后重写这两个方法:
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
selection.setText(items[position]);
}
public void onNothingSelected(AdapterView<?> parent) {
selection.setText("");
}
https://stackoverflow.com/q/1714426/811625
您可以通过简单的检查来避免调用 OnItemSelectedListener():将当前选择索引存储在一个整数变量中,并在执行任何操作之前检查 onItemSelected(..)。
例如:
Spinner spnLocale;
spnLocale = (Spinner)findViewById(R.id.spnLocale);
int iCurrentSelection = spnLocale.getSelectedItemPosition();
spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if (iCurrentSelection != i){
// Your code here
}
iCurrentSelection = i;
}
public void onNothingSelected(AdapterView<?> adapterView) {
return;
}
});
因为 iCurrentSelection
应该在对象范围内才能工作!
iCurrentSelection
变量,它将正常工作。您可以将其初始化为 -1,以便在第一次调用时执行代码。
在 onCreate 或 onStart 中设置 OnItemSelectedListener 并不重要 - 它仍将在 Activity 创建或启动期间(分别)被调用。所以我们可以在 onCreate 中设置它(而不是在 onStart 中!)。只需添加一个标志来确定第一次初始化:
private Spinner mSpinner;
private boolean mSpinnerInitialized;
然后在 onCreate(或 onCreateView)中:
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if (!mSpinnerInitialized) {
mSpinnerInitialized = true;
return;
}
// do stuff
}
public void onNothingSelected(AdapterView<?> adapterView) {
return;
}
});
找到您的微调器名称并找到 id 然后实现此方法。
spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// your code here
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
对于 kotlin,您可以使用:
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
注意:对于 onItemSelected
方法的参数,我使用自定义变量名称
spinner-widget 的文档说
微调器不支持项目单击事件。
您应该使用 setOnItemSelectedListener
来处理您的问题。
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
为当前选择的微调器取一个全局变量:
int currentItem = 0;
spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);
spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(currentItem == position){
return; //do nothing
}
else
{
TextView spinner_item_text = (TextView) view;
//write your code here
}
currentItem = position;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"
android:textColor="@color/black"
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>
//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#e2e3d7" />
</shape>
</item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
<solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>
如果你想要一个真正的 onChangedListener()。将初始值存储在处理程序中并检查它是否已更改。它很简单,不需要全局变量。如果页面上有多个微调器,则可以使用。
String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));
...
protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {
private SpinnerSelectedListener() {
super();
}
public SpinnerSelectedListener(String initialValue) {
this();
this.initialValue = initialValue;
}
private String initialValue;
// getter and setter removed.
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
final String newValue = (String) spinHeight.getItemAtPosition(position);
if (newValue.equals(initialValue) == false) {
// Add your code here. The spinner has changed value.
// Maybe useful.
// initialValue = newValue;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Maybe useful.
// initialValue = null;
}
}
对象是你的朋友,使用它们。
spinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
//add some code here
}
);
这将工作初始化微调器和 findviewbyid 并使用它会工作
Spinner schemeStatusSpinner;
schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);
schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// your code here
if(schemeStatusSpinner.getSelectedItemId()==4){
reasonll.setVisibility(View.VISIBLE);
}
else {
reasonll.setVisibility(View.GONE);
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
默认情况下,您将通过
value = spinner.getSelectedItem().toString();
每当您在微调器中选择值时,这将为您提供所选值
如果您想要所选项目的位置,那么就这样做
pos = spinner.getSelectedItemPosition();
以上两个答案是针对不应用侦听器的
我认为最好的方法是在 onCreate()
中添加一个 flagitemselected = 0;
。并且在项目选择的事件上增加该标志,即flagitemselected++
;然后检查
if(flagitemselected!=1)
{
// do your work here
}
这将有助于我猜。
我知道这早就解决了,但我的字符串数组顶部有一个“请选择”字符串。然后当你写监听器时
yourspinner.onItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(adapterView: AdapterView<*>?, view: View, i: Int, l: Long) {
yourvalue = yourspinner.getSelectedItem().toString()
when(yourvalue){
"Please Select" -> // DO nothing
else -> // Do something
}
}
override fun onNothingSelected(adapterView: AdapterView<*>?) {
return
}
}
您当然可以扩展 when 语句以获得不同的响应或操作。
我发现的一个技巧是将您的 setOnItemSelectedListeners 放入 onWindowFocusChanged 而不是 onCreate。我还没有发现这样做有任何不好的副作用。基本上,在绘制窗口后设置监听器。我不确定 onWindowFocusChanged 运行的频率,但如果您发现它运行得太频繁,那么为自己创建一个锁变量很容易。
我认为 Android 可能正在使用基于消息的处理系统,如果您将其全部放在 onCreate 中,您可能会遇到微调器在绘制后被填充的情况。因此,您的侦听器将在您设置项目位置后触发。当然,这是一个有根据的猜测,但请随时纠正我。
onItemSelected(...)
未命中。 (我知道,因为我刚刚发现了这一点。)