问答中心分类: ANDROIDAndroid Spinner:获取所选项目更改事件
0
匿名用户 提问 1小时 前

当所选项目发生更改时,如何为微调器设置事件侦听器?
基本上我想做的是类似的事情:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
user1470285 回复 1小时 前

我试过这些答案,但没人能帮上忙。一旦微调器组件不支持项单击事件。微调器文档

17 Answers
0
znq 回答 1小时 前

前面的一些答案是不正确的。它们适用于其他小部件和视图,但是微调器小部件明确指出:

微调器不支持项目单击

更好地利用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
    }

});

这对我有用。
注意,当正在构建视图时也调用OnItMeMead方法,因此您可以考虑将其放入内部。onCreate()方法调用。

Kennethvr 回复 1小时 前

问题是,在构建视图时也会调用onItemSelected方法。因此,在那里编写的代码也会在启动时执行。是否只有在用户调用了真实的项目选择时,才有办法执行包含代码的代码?

Kennethvr 回复 1小时 前

实际上,通过将setOnItemSelectedListener放在override OnStart方法中,而不是放在onCreate方法中,可以解决这个问题。愚蠢的我。。。

Yevgeny Simkin 回复 1小时 前

我把监听器放在onStart方法中,但它是在用户看到任何东西之前调用的,就像onCreate一样,因此,在我的例子中,一个“继续”按钮在用户选择某个东西之前是不可见的,该按钮在初始显示时是可见的。你是说你的经历不同吗?如果是这样的话,在onStart方法中,您有什么不同的做法,而我没有?

Sam Svenbjorgchristiensensen 回复 1小时 前

在匿名侦听器中使用另一个字段来记录第一个选择,并告诉onItemSelected不要做任何事情,除非遇到选择?只是一个想法。

Andrew Wyld 回复 1小时 前

但是,如果用户选择了“默认”项,即最上面的一项,该怎么办?然后onItemSelected(...)没有被击中。(我知道,因为我刚刚艰难地发现了这一点。)

Shine 回复 1小时 前

上还讨论了在创建活动时调用onItemSelected的问题堆栈溢出。com/questions/2562248/…

pmont 回复 1小时 前

我建议利用在构建过程中调用setOnItemSelectedListener的优势。以此为契机初始化微调器。我还看到,无论是在onStart还是onCreate中添加,都会调用侦听器。

Muhammad Ahmed AbuTalib 回复 1小时 前

还有一种方法是在数组顶部引入一个默认选项,如“请选择”,并在onitemselected中引入一个条件,如果selectedview。gettext返回“请选择”。

Steve Waring 回复 1小时 前

我将一个类变量int设置为我将在onCreate中添加的微调器侦听器的数量,并在调用每个onItemSelected时将其递减。直到它归零,他们才回来。

user13926345 回复 1小时 前

没事吧?如果我不把任何代码放进去public void onNothingSelected.

SVK 回复 1小时 前

请您就以下问题提供指导:堆栈溢出。com/questions/67985653/…

0
Santhosh 回答 1小时 前
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. 用户手动选择

尝试使用flag变量来区分这两个变量。

MAC 回复 1小时 前

我的也被打了两次电话!我搞不懂你是怎么区分这两者的?

Yevgeny Simkin 回复 1小时 前

只需设置一个全局布尔值,比如Boolean initialDisplay=true;然后在onSelect中查看它是否为真,如果为真,请不要在select上执行任何其他操作,而是在下次调用时(当用户实际选择时)将标志设置为false。

Pankaj Kumar 回复 1小时 前

关于OnclickListener执行的最佳解释。

Bennett Von Bennett 回复 1小时 前

我个人感到震惊的是,如此简单的东西——如此基本的UI小部件——如此难以实现。。。说真的——构建一个“默认显示项”属性并将布尔标志属性构建到对象类本身有多难??我不喜欢Objective C,但我要说的是,iOS小部件的实现大约需要安卓系统的十分之一时间。

cantfindaname88 回复 1小时 前

我完全同意你的看法。他们可以在参数中给我们传递一个布尔值,而不是我们自己实现一个标志。这太愚蠢了,除非有什么我不知道的。

Batdude 回复 1小时 前

我也同意。旋转器是一个搞砸了的小部件。很难知道弹出窗口或下拉窗口何时打开或关闭。为这件事增加一个活动会这么难吗?上面的解决方案几乎可以告诉你列表是打开还是关闭的,但有三个问题:(1)没有选择已选项目的事件(列表关闭)和(2)没有中止事件(触发列表关闭)和(3)onNothingSelected对我来说似乎从未触发。

jedi 回复 1小时 前

Genia S.方法并不能很好地工作,因为在选择事件(onCreate方法)上第一次触发事件时,确实可以通过全局变量排除此事件,但如果我需要在微调器上选择已选择的项(默认项,第一个),则不会触发。我试图放置一个微调器标签并将其排除,但它将在打开的对话框中可见。我同意@Batdude。旋转器是一个搞砸了的小部件。

LarsH 回复 1小时 前

还请注意,如果使用Genia的方法,并且有多个微调器使用相同的方法onItemSelectedListener,您必须分别跟踪每个微调器的初始显示,或者统计初始调用,直到达到微调器的数量:-P

SVK 回复 1小时 前

请您就以下问题提供指导:堆栈溢出。com/questions/67985653/…

0
Dhasneem 回答 1小时 前

你可以实现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("");
}
bro 回复 1小时 前

如何获得“选择”?

0
Sampath 回答 1小时 前

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

dahvyd 回复 1小时 前

不能在匿名内部类中使用非final变量。如果iCurrentSelection变量是在这个匿名类中声明的,它可以正常工作。您可以将其初始化为-1,以便在第一次调用时执行代码。

natur3 回复 1小时 前

@dahvyd是正确的,如果你用这个,int必须是最终的。不管怎样,它都很管用。如果未选择位置0,我正在禁用EditText字段,如果它已更改,请重新启用它。谢谢你。

0
droidster.me 回答 1小时 前

找到微调器名称和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
    }
});