Android的微调:获取选中项更改事件(Android Spinner: Get the sele

2019-06-21 04:01发布

您如何设置一个微调时,所选项目的变化事件监听器?

基本上,我试图做的就是类似这样的东西:

spinner1.onSelectionChange = handleSelectionChange;

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

Answer 1:

一些以前的答案是不正确的。 他们对其他部件和意见的工作,但对于文档微调控件中明确规定:

喷丝不支持产品Click事件。 调用此方法将引发异常。

更好地利用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()方法调用。



Answer 2:

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. 用户手动选择

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



Answer 3:

您可以实现AdapterView.OnItemSelectedListener在你的Activity类。

然后使用内以下行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("");
}


Answer 4:

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应该是在对象范围内这个工作!



Answer 5:

对于微调器 - 插件的文件说:“一个微调不支持产品Click事件。” 您应该使用“setOnItemSelectedListener”来处理你的问题



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


Answer 7:

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


Answer 8:

不要紧,你会在的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;
            }
        });


Answer 9:

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

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



Answer 10:

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


Answer 11:

采取微调的当前选择一个全局变量:

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>


Answer 12:

辉煌斯特凡Klumpp的上面还帮了我很多。 谢谢。 我是一个新手,在“@覆盖”,它出现引起了“必须覆盖同名的超类方法”的错误。 Eclipse的建议我应该删除重写。 当我这样做,它的工作。 请不要问我如何或为何。



Answer 13:

西隧我认为最好的办法是有一个flagitemselected = 0; 在OnCreate中。 而在项目选择事件的增量该标志即flagitemselected ++; 然后检查(flagitemselected!= 1){//做你的工作在这里}。这将帮助我猜



Answer 14:

这将工作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
        }

    });


Answer 15:

一招我发现这是把你的setOnItemSelectedListeners在onWindowFocusChanged代替的onCreate。 我还没有发现任何不良的副作用以做这种方式,但。 基本上,窗口被抽出后成立的听众。 我不知道多久onWindowFocusChanged运行,但它很容易地创建自己锁变量,如果你发现它往往运行。

我认为Android可能会使用基于消息的处理系统,如果你把它全部的onCreate,你可能会碰到那里得到延伸后的微调被填充的情况。 所以,你设置的项目位置后,侦听器将火过。 这是一个受过教育的猜测,当然,但随时纠正我在此。



文章来源: Android Spinner: Get the selected item change event