Eu criei um aplicativo Android com a Spinner
e a TextView
. Quero exibir o item selecionado na lista suspensa do Spinner no TextView. Eu implementei o Spinner no onCreate
método, portanto, quando estou executando o programa, ele mostra um valor no TextView
(antes de selecionar um item na lista suspensa).
Quero mostrar o valor no TextView somente depois de selecionar um item na lista suspensa. Como eu faço isso?
Aqui está o meu código:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class GPACal01Activity extends Activity implements OnItemSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
TextView textView = (TextView) findViewById(R.id.textView1);
String str = (String) parent.getItemAtPosition(pos);
textView.setText(str);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
android
android-layout
android-spinner
Conceder
fonte
fonte
Respostas:
Então, pela primeira vez, lide com isso com qualquer valor Inteiro
Exemplo: Tomar inicialmente
int check = 0;
Você pode fazer isso com valor booleano e também verificando as posições atuais e anteriores. Veja aqui
fonte
Basta colocar esta linha antes de definir OnItemSelectedListener
fonte
setSelection(int, boolean)
chamasetSelectionInt()
internamente e você precisa definir o ouvinte após (em vez de antes) chamar isso. Cuidado quesetSelection(int)
não funcionará, porque chamasetNextSelectedPositionInt()
internamente, e foi isso que me levou até aqui.A partir do nível 3 da API, você pode usar onUserInteraction () em uma Atividade com um valor booleano para determinar se o usuário está interagindo com o dispositivo.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
Como um campo da Atividade, tenho:
Finalmente, meu spinner:
À medida que você entra e sai da atividade, o booleano é redefinido para false. Funciona como um encanto.
fonte
Isso funcionou para mim
A inicialização do Spinner no Android é problemática às vezes, o problema acima foi resolvido por esse padrão.
O adaptador de configuração deve ser a primeira parte e onItemSelectedListener (this) será o último ao inicializar um girador. Pelo padrão acima, meu OnItemSelected () não é chamado durante a inicialização do spinner
fonte
haha ... eu tenho a mesma pergunta. Quando initViews () apenas faz assim. A sequência é a chave, o ouvinte é o último. Boa sorte !
fonte
Minha solução:
fonte
Para evitar chamar spinner.setOnItemSelectedListener () durante a inicialização
fonte
Você pode fazer isso desta maneira:
Inicialmente, crio um ouvinte e atribuo a um retorno de chamada variável; então eu crio um segundo ouvinte anônimo e quando isso é chamado pela primeira vez, isso altera o ouvinte =]
fonte
O sinalizador de interação do usuário pode ser definido como true no método onTouch e redefinido
onItemSelected()
após a alteração na seleção. Prefiro esta solução porque o sinalizador de interação do usuário é tratado exclusivamente para o girador, e não para outras visualizações da atividade que podem afetar o comportamento desejado.Em código:
Crie seu ouvinte para o spinner:
Adicione o ouvinte ao girador como an
OnItemSelectedListener
e anOnTouchListener
:fonte
Solução simples semelhante que permite vários rotadores é colocar o AdapterView em uma coleção - na superclasse de Atividades - na primeira execução de onItemSelected (...). Depois, verifique se o AdapterView está na coleção antes de executá-lo. Isso permite um conjunto de métodos na superclasse e suporta vários AdapterViews e, portanto, vários giradores.
Superclasse ...
Subclasse ...
}
fonte
crie um campo booleano
dentro de criar a atividade
fonte
Tente isto
fonte
Você pode conseguir isso setOnTouchListener primeiro e depois setOnItemSelectedListener no onTouch
fonte
Isso funcionou para mim:
fonte
Com base na resposta de Abhi, fiz este ouvinte simples
fonte
Teve o mesmo problema e isso funciona para mim:
Eu tenho 2 spinners e os atualizo durante o init e durante as interações com outros controles ou após obter dados do servidor.
Aqui está o meu modelo:
Quando a classe estiver iniciando, use setSpinnersListeners () em vez de definir diretamente o ouvinte.
O Runnable impedirá que o girador seja acionado onItemSelected logo após você definir seus valores.
Se você precisar atualizar o botão giratório (após uma chamada do servidor etc.), use removeSpinnersListeners () imediatamente antes das linhas de atualização e setSpinnersListeners () logo após as linhas de atualização. Isso impedirá que o onItemSelected seja acionado após a atualização.
fonte
Código
fonte
Para mim, a solução da Abhi funciona muito bem até o nível 27 da API.
Mas parece que a partir do Api nível 28 e acima, onItemSelected () não é chamado quando o listener é definido, o que significa que onItemSelected () nunca é chamado.
Portanto, adicionei uma declaração if curta para verificar o nível da API:
Acho isso muito estranho e não tenho certeza se os outros também têm esse problema, mas no meu caso funcionou bem.
fonte
Coloquei um TextView em cima do Spinner, do mesmo tamanho e plano de fundo que o Spinner, para que eu tivesse mais controle sobre a aparência antes de o usuário clicar nele. Com o TextView lá, eu também poderia usar o TextView para sinalizar quando o usuário começar a interagir.
Meu código Kotlin é mais ou menos assim:
O arquivo de layout se parece com isso, com a parte importante sendo que o Spinner e o TextView compartilham a mesma largura, altura e margens:
Tenho certeza de que as outras soluções funcionam onde você ignora a primeira chamada onItemSelected, mas realmente não gosto da ideia de assumir que ela sempre será chamada.
fonte