Android微调器:获取所选项目更改事件

Android微调器:获取所选项目更改事件,android,events,spinner,android-spinner,Android,Events,Spinner,Android Spinner,当所选项目更改时,如何为微调器设置事件侦听器 基本上,我想做的事情与此类似: spinner1.onSelectionChange = handleSelectionChange; void handleSelectionChange(Object sender){ //handle event } spinner小部件的文档说 微调器不支持项目单击事件 您应该使用setOnItemSelectedListener来处理您的问题。前面的一些答案不正确。它们适用于其他窗口小部件和视图,

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

基本上,我想做的事情与此类似:

spinner1.onSelectionChange = handleSelectionChange;

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

spinner小部件的文档说

微调器不支持项目单击事件


您应该使用
setOnItemSelectedListener
来处理您的问题。

前面的一些答案不正确。它们适用于其他窗口小部件和视图,但文档中明确指出:

微调器不支持项目单击 事件。调用此方法将引发 例外

更好地使用:

spinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图selectedItemView、整型位置、长id){
//你的代码在这里
}
@凌驾
未选择公共无效(AdapterView父视图){
//你的代码在这里
}
});
这对我有用

注意,当正在构建视图时也调用OnItMeMead方法,因此可以考虑将其放入代码> OnCeCATE()/<代码>方法调用。

微调器spnLocale=(微调器)findViewById(R.id.spnLocale);
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;
    } 
}); 
setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){ 已选择公共视图(AdapterView AdapterView,View视图,int i,long l){ //你的代码在这里 } 未选择公共无效(AdapterView AdapterView){ 返回; } });
注意:记住一件事

微调器
OnItemSelectedListener
事件将执行两次:

  • 微调器初始化
  • 用户手动选择
  • 尝试使用flag变量来区分这两个变量。

    您可以通过简单的检查来避免调用OnItemSelectedListener():将当前选择索引存储在整数变量中,并在执行任何操作之前在onItemSelected(..)中进行检查

    例如:

    微调器spnLocale;
    spnLocale=(微调器)findViewById(R.id.spnLocale);
    int iccurrentselection=spnLocale.getSelectedItemPosition();
    setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
    已选择公共视图(AdapterView AdapterView,View视图,int i,long l){
    如果(iCurrentSelection!=i){
    //你的代码在这里
    }
    iccurrentselection=i;
    } 
    未选择公共无效(AdapterView AdapterView){
    返回;
    } 
    }); 
    

    原因
    ICcurrentSelection
    应该在对象范围内才能工作
    我认为最好的方法是选择一个
    flagitemselected=0
    onCreate()
    中。并在所选项目事件上增加该标志,即
    flagitemselected++
    ;然后检查

    if(flagitemselected!=1)
    {
    // do your work here
    }
    

    这将有助于我的猜测。

    我发现的一个技巧是将setOnItemSelectedListeners放在onWindowFocusChanged而不是onCreate中。我还没有发现这样做有任何不良副作用。基本上,在绘制窗口后设置侦听器。我不确定onWindowFocusChanged运行的频率,但是如果您发现它运行得太频繁,那么创建一个锁变量就很容易了


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

    找到您的微调器名称并找到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
        }
    });
    
    spinnername.setOnItemSelectedListener(新的OnItemSelectedListener(){
    @凌驾
    已选择公共视图(AdapterView父视图、视图selectedItemView、整型位置、长id){
    //你的代码在这里
    }
    @凌驾
    未选择公共无效(AdapterView父视图){
    //你的代码在这里
    }
    });
    
    您可以在活动中实现
    AdapterView.OnItemSelectedListener

    然后在
    onCreate()中使用下面的行

    然后重写这两种方法:

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
        selection.setText(items[position]);
    }
    
    public void onNothingSelected(AdapterView<?> parent) {
        selection.setText("");
    }
    
    public void已选择(AdapterView父视图、视图v、int位置、长id){
    selection.setText(项目[位置]);
    }
    未选择公共无效(AdapterView父级){
    selection.setText(“”);
    }
    
    spinner.setOnItemSelectedListener(
    新建AdapterView.OnItemSelectedListener(){
    @凌驾
    已选择公共视图(AdapterView arg0、视图arg1、,
    整数arg2,长arg3){
    //TODO自动生成的方法存根
    }
    @凌驾
    未选择公共无效(AdapterView arg0){
    //TODO自动生成的方法存根
    }
    //在这里添加一些代码
    }
    );
    
    为当前选择的微调器获取全局变量:

    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>
    
    int currentItem=0;
    微调器计数器=(微调器)findViewById(R.id.spinner\u计数器);
    字符串[]值={“20”、“40”、“60”、“80”、“100”、“全部”};
    aa=新阵列适配器(此,R.layout.spinner\u item\u profile,值);
    aa.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
    微调器/计数器设置适配器(aa);
    微调器\计数器.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
    @凌驾
    已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
    如果(currentItem==位置){
    return;//什么也不做
    }
    其他的
    {
    TextView微调器\项目\文本=(TextView)视图;
    //在这里编写代码
    }
    当前项=位置;
    }
    @凌驾
    未选择公共无效(AdapterView父级){
    }
    });
    //R.layout.spinner\u项目\u配置文件
    //可绘制/边框\闭合\剖面
    
    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
        }
    });
    
    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("");
    }
    
    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>
    
    private Spinner mSpinner;
    private boolean mSpinnerInitialized;
    
    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;
                }
            });
    
    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 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
            }
    
        });
    
    value = spinner.getSelectedItem().toString();
    
    pos = spinner.getSelectedItemPosition();
    
    spinner.onItemSelectedListener =  object : AdapterView.OnItemSelectedListener {
        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            
        }
    
        override fun onNothingSelected(p0: AdapterView<*>?) {
            
        }
    }
    
    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
                }
            }