安卓旋转器:获取选中项变化事件
-
20-09-2019 - |
题
当所选项目发生更改时,如何设置 Spinner 的事件侦听器?
基本上我想做的事情与此类似:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
解决方案
一些以前的答案是不正确的。他们对其他部件和意见的工作,但对于的微调插件明确规定:
一个旋转器不支持项点击 事件。调用此方法将引发 一个例外。
更好地利用 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;
}
});
笔记: 记住一件事。
旋转器 OnItemSelectedListener
事件将执行两次:
- 微调器初始化
- 用户手动选择
尝试使用标志变量来区分这两者。
您可以在活动实施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(..)内检查
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;
}
});
<强>事业的iCurrentSelection
应该在此对象范围工作!强>
查找您的微调名字,找到然后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
}
});
为所说的纺丝器,插件的文档说
一个微调不支持产品Click事件。
您应该使用setOnItemSelectedListener
来处理你的问题。
不要紧,你会在的onCreate或在onStart设置OnItemSelectedListener - 它仍然会活动创造的过程中被调用或启动(分别)结果。 因此,我们可以将其设置成的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;
}
});
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
如果你想有一个真正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
}
);
采取一个全局变量为纺丝器的当前的选择:
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>
此将工作 intialize旋转器和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
}
});
我认为将有flagitemselected = 0;
的onCreate()
的最好方法。而在项目选择事件的增量该标志即flagitemselected++
;然后检查
if(flagitemselected!=1)
{
// do your work here
}
这将有助于我猜。
一招我发现这是把你的setOnItemSelectedListeners在onWindowFocusChanged代替的onCreate。我还没有发现任何不良的副作用以做这种方式,但。基本上,窗口被抽出后成立的听众。我不知道多久onWindowFocusChanged运行,但它很容易地创建自己锁变量,如果你发现它往往运行。
我认为Android可能会使用基于消息的处理系统,如果你把它全部的onCreate,你可能会碰到那里得到延伸后的微调被填充的情况。所以,你设置的项目位置后,侦听器将火过。这是一个受过教育的猜测,当然,但随时纠正我在此。