Android Spinner:获取所选的项目更改事件

时间:2009-08-26 20:53:47

标签: android events spinner

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

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

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

18 个答案:

答案 0 :(得分:754)

以前的一些答案不正确。它们适用于其他小部件和视图,但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()方法调用中。

答案 1 :(得分:51)

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事件将执行两次:

  1. Spinner初始化
  2. 手动选择用户
  3. 尝试使用标志变量区分这两者。

答案 2 :(得分:17)

您可以在“活动”中实施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("");
}

答案 3 :(得分:15)

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应该在对象范围内才能生效!

答案 4 :(得分:7)

spinner-widget的文档说:“一个微调器不支持项目点击事件。” 您应该使用“setOnItemSelectedListener”来处理您的问题

答案 5 :(得分:6)

找到你的微调名称并找到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
    }
});

答案 6 :(得分:5)

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

答案 7 :(得分:5)

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

答案 8 :(得分:4)

如果你想要一个真正的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; 
        }
    }

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

为当前选择的微调器选择一个全局变量:

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>

答案 11 :(得分:3)

对于Kotlin,您可以使用:

// str is still ‘aA’
// str.toLowerCase() returns a *new string* and leaves str unchanged

str.indexOf(char) // “aA”.indexOf(‘a’) === 0
str.lastIndexOf(char) // “aA”.indexOf(‘a’) === 0

注意:对于spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { } override fun onNothingSelected(p0: AdapterView<*>?) { } } 方法的参数,我使用自定义变量名称

答案 12 :(得分:2)

默认情况下,您将通过微调器阵列获得第一项

value = spinner.getSelectedItem().toString();

无论何时在微调器中选择值,都会为您提供所选值

如果要选择所选项目的位置,则可以这样做

pos = spinner.getSelectedItemPosition();

以上两个答案是针对不应用侦听器的人

答案 13 :(得分:1)

Stefan Klumpp对此的精彩表现也给了我很多帮助。谢谢。 我是一个新手,其中的“@Override”导致了一个错误,“必须覆盖同名的超类方法”。 Eclipse建议我应该删除Overrides。当我这样做时,它起作用了。请不要问我是怎么回事。

答案 14 :(得分:1)

我认为最好的方法是让一个flagitemselected = 0;在oncreate。并且在项目选择的事件增量上标志,即flagitemselected ++;然后检查是否(flagitemselected!= 1){//在这里做你的工作}。这将有助于我猜测

答案 15 :(得分:1)

这将起作用 初始化微调器和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
        }

    });

答案 16 :(得分:0)

我发现的一个技巧是将你的setOnItemSelectedListeners放在onWindowFocusChanged而不是onCreate上。我没有发现这样做的任何不良副作用。基本上,在绘制窗口后设置监听器。我不确定onWindowFocusChanged运行的频率是多少,但是如果你发现它经常运行,那么创建自己的锁变量很容易。

我认为Android可能正在使用基于消息的处理系统,如果你把它全部放在onCreate中,你可能会遇到微调器在绘制之后被填充的情况。因此,在设置项目位置后,您的听众将会启动。当然,这是一个有根据的猜测,但请随时纠正我。

答案 17 :(得分:0)

我知道这已经解决了很久,但是我在字符串数组的顶部有一个“请选择”字符串。然后,当您编写监听器时

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语句以具有不同的响应或动作。