Android Spinner:获取选中的项目改变事件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1337424/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android Spinner: Get the selected item change event
提问by Soni Ali
How can you set the event listener for a Spinner when the selected item changes?
当所选项目更改时,如何为 Spinner 设置事件侦听器?
Basically what I am trying to do is something similar to this:
基本上我想做的是类似于这样的事情:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
回答by znq
Some of the previous answers are not correct. They work for other widgets and views, but the documentation for the Spinner widgetclearly states:
之前的一些答案是不正确的。它们适用于其他小部件和视图,但Spinner 小部件的文档明确指出:
A spinner does not support item click events. Calling this method will raise an exception.
微调器不支持项目点击事件。调用此方法将引发异常。
Better use OnItemSelectedListener()instead:
最好使用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
}
});
This works for me.
这对我有用。
Note that onItemSelected method is also invoked when the view is being build, so you can consider putting it inside onCreate()
method call.
请注意,在构建视图时也会调用 onItemSelected 方法,因此您可以考虑将其放在onCreate()
方法调用中。
回答by Santhosh
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;
}
});
Note:Remember one thing.
注意:记住一件事。
Spinner OnItemSelectedListener
event will execute twice:
SpinnerOnItemSelectedListener
事件将执行两次:
- Spinner initialization
- User selected manually
- 微调器初始化
- 用户手动选择
Try to differentiate those two by using flag variable.
尝试通过使用标志变量来区分这两者。
回答by Dhasneem
You can implement AdapterView.OnItemSelectedListener
class in your Activity.
您可以AdapterView.OnItemSelectedListener
在您的活动中实现类。
And then use the below line within onCreate()
然后在里面使用下面的行 onCreate()
Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
Then override these two methods:
然后覆盖这两个方法:
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
selection.setText(items[position]);
}
public void onNothingSelected(AdapterView<?> parent) {
selection.setText("");
}
回答by Sampath
https://stackoverflow.com/q/1714426/811625
https://stackoverflow.com/q/1714426/811625
You can avoid the OnItemSelectedListener() being called with a simple check: Store the current selection index in an integer variable and check within the onItemSelected(..) before doing anything.
您可以通过简单的检查来避免调用 OnItemSelectedListener():将当前选择索引存储在一个整数变量中,并在执行任何操作之前在 onItemSelected(..) 中进行检查。
E.g:
例如:
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;
}
});
Of cause the iCurrentSelection
should be in object scope for this to work!
原因iCurrentSelection
应该在对象范围内才能工作!
回答by droidster.me
Find your spinner name and find id then implement this method.
找到您的微调器名称并找到 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
}
});
回答by Leo Droidcoder
It doesn't matter will you set OnItemSelectedListener in onCreate or onStart - it will still be called during of Activity creation or start (respectively).
So we can set it in onCreate (and NOT in onStart!).
Just add a flag to figure out first initialisation:
在 onCreate 或 onStart 中设置 OnItemSelectedListener 无关紧要 - 在 Activity 创建或启动期间(分别)仍会调用它。
所以我们可以在 onCreate 中设置它(而不是在 onStart 中!)。
只需添加一个标志来确定第一次初始化:
private Spinner mSpinner;
private boolean mSpinnerInitialized;
then in onCreate (or onCreateView) just:
然后在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;
}
});
回答by johndotnet
The docs for the spinner-widget says
Spinner-widget 的文档说
A spinner does not support item click events.
微调器不支持项目点击事件。
You should use setOnItemSelectedListener
to handle your problem.
您应该使用setOnItemSelectedListener
来处理您的问题。
回答by Chiwai Chan
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
回答by fishjd
If you want a true onChangedListener(). Store the initial value in the handler and check to see if it has changed. It is simple and does notrequire a global variable. Works if you have more than one spinner on the page.
如果你想要一个真正的 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;
}
}
Objects are your friend, use them.
对象是您的朋友,请使用它们。
回答by indrajeet
take a global variable for current selection of spinner:
为当前选择的微调器取一个全局变量:
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>