Android微调:获取select的项目更改事件

当所选项目更改时,如何为Spinner设置事件侦听器?

基本上我想要做的是类似于这样的事情:

spinner1.onSelectionChange = handleSelectionChange; void handleSelectionChange(Object sender){ //handle event } 

以前的一些答案是不正确的。 他们为其他小工具和视图工作,但是Spinner小部件的文档明确指出:

微调不支持项目点击事件。 调用这个方法会引发一个exception。

更好地使用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 } }); 

这对我有用。

请注意,在构build视图时,也会调用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事件将执行两次:

  1. 微调器初始化
  2. 用户手动select

尝试通过使用标记variables来区分这两个。

你可以在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():将当前select索引存储在整型variables中,并在执行任何操作之前检查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应该在对象范围内工作!

微调控件的文档说:“微调不支持项目点击事件。 你应该使用“setOnItemSelectedListener”来处理你的问题

 spinner1.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { //add some code here } ); 

find你的微调名称,findid然后执行这个方法。

 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 } }); 

采取一个全局variables为目前的select微调:

 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> 
 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 } ); 

在onCreate或onStart中设置OnItemSelectedListener无关紧要 – 在创buildActivity或启动(分别)期间仍将调用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; } }); 

如果你想要一个真正的onChangedListener()。 将初始值存储在处理程序中,并检查它是否已经更改。 这很简单,不需要全局variables。 如果页面上有多个微调框,则工作。

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

对象是你的朋友,使用它们。

上述斯蒂芬·克鲁普(Stefan Klumpp)的辉煌也为我提供了很多帮助。 谢谢。 我是一个新手,其中的“@Override”导致“必须重写相同名称的超类方法”的错误。 Eclipsebuild议我应该删除Overrides。 当我这样做,它的工作。 请不要问我如何或为什么。

我认为最好的办法是有一个flagitemselected = 0; 在创造。 并在项目上select事件递增该标志即flagitemselected ++; 然后检查(flagitemselected!= 1){//在这里做你的工作}。这将有助于我猜测

我发现的一个技巧是把你的setOnItemSelectedListeners放在onWindowFocusChanged而不是onCreate。 我还没有发现这样做的不良副作用。 基本上,窗口绘制后设置听众。 我不确定在WindowsFocusChanged上运行多less次,但是如果你发现它运行得太频繁,就很容易创build一个锁variables。

我认为Android可能会使用基于消息的处理系统,如果你把它全部放在onCreate中,你可能会遇到这样的情况,即在绘制后,微调器被填充。 所以,当你设定物品位置后,你的听众会开火。 当然,这是一个有教养的猜测,但随时纠正我。