Pergunta

Como você pode definir o ouvinte do evento para um spinner quando o item selecionado muda?

Basicamente, o que estou tentando fazer é algo semelhante a isso:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
Foi útil?

Solução

Algumas das respostas anteriores não estão corretas. Eles trabalham para outros widgets e visualizações, mas a documentação para o Widget Spinner Claramente afirma:

Um spinner não suporta eventos de clique no item. Chamar esse método aumentará uma exceção.

Melhor uso OniTemSelectedListener () em vez de:

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
    }

});

Isso funciona para mim.

Observe que o método oniTemSelected também é chamado quando a visualização está sendo construída, para que você possa considerar colocá -lo dentro onCreate() Chamada de método.

Outras dicas

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

Observação: Lembre -se de uma coisa.

Spinner OnItemSelectedListener O evento será executado duas vezes:

  1. Inicialização do girador
  2. Usuário selecionado manualmente

Tente diferenciar esses dois usando a variável de sinalizador.

Você pode implementar AdapterView.OnItemSelectedListener classe em sua atividade.

E então use a linha abaixo dentro onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

Em seguida, substitua esses dois métodos:

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

Você pode evitar o OnItemSelectedListener () sendo chamado com uma verificação simples: armazene o índice de seleção atual em uma variável inteira e verifique no OnItemSelected (..) antes de fazer qualquer coisa.

Por exemplo:

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

De causa o iCurrentSelection deve estar no escopo do objeto para que isso funcione!

Encontre o nome do seu spinner e encontre ID, implemente esse método.

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

Os documentos para o spinner-widget diz

Um spinner não suporta eventos de clique no item.

Você deveria usar setOnItemSelectedListener para lidar com o seu problema.

Não importa que você definirá o OnItemSelectedListener no OnCreate ou no OnStart - ele ainda será chamado durante a criação de atividades ou o início (respectivamente).
Para que possamos defini -lo no OnCreate (e não no OnStart!).
Basta adicionar uma bandeira para descobrir a primeira inicialização:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

Então, no OnCreate (ou OnCreateview), apenas:

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;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

Se você deseja um verdadeiro onchangedListener (). Armazene o valor inicial no manipulador e verifique se ele mudou. É simples e faz não requer uma variável global. Funciona se você tiver mais de um girador na página.

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

Objetos são seus amigos, use -os.

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

Pegue uma variável global para a seleção atual de Spinner:

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>

Isso funcionará intializará o spinner e o FindViewById e usará isso, ele funcionará

    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
        }

    });

A melhor maneira de eu pensar seria ter um flagitemselected = 0; dentro onCreate(). E no Item Selected Event Increment That Flag, ou seja, flagitemselected++; e então verifique

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

Isso vai ajudar, eu acho.

Um truque que encontrei foi colocar seus SetonItemSelectedListeners em OnWindowFocusChanged em vez de OnCreate. Ainda não encontrei efeitos colaterais ruins para fazer dessa maneira. Basicamente, configure os ouvintes depois que a janela é desenhada. Não tenho certeza com que frequência o OnWindowFocusChanged Runs, mas é fácil o suficiente criar uma variável de bloqueio se você estiver encontrando funcionando com muita frequência.

Eu acho que o Android pode estar usando um sistema de processamento baseado em mensagens e, se você colocar tudo no OnCreate, poderá entrar em situações em que o spinner será preenchido depois que ele for desenhado. Portanto, seu ouvinte disparará depois de definir o local do item. Este é um palpite educado, é claro, mas fique à vontade para me corrigir sobre isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top