Eu quero usar um Spinner que inicialmente (quando o usuário ainda não fez uma seleção) exibe o texto "Selecionar um". Quando o usuário clica no botão giratório, a lista de itens é exibida e o usuário seleciona uma das opções. Depois que o usuário faz uma seleção, o item selecionado é exibido no Spinner em vez de "Select One".
Eu tenho o seguinte código para criar um Spinner:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Com este código, inicialmente o item "Um" é exibido. Eu poderia apenas adicionar um novo item "Selecionar um" aos itens, mas, em seguida, "Selecionar um" também seria exibido na lista suspensa como primeiro item, o que não é o que eu quero.
Como posso resolver este problema?
android
android-spinner
Pieter Kuijpers
fonte
fonte
Respostas:
Aqui está uma solução geral que substitui a
Spinner
exibição. SubstituisetAdapter()
para definir a posição inicial como -1 e proxies do fornecidoSpinnerAdapter
para exibir a sequência de prompt para a posição menor que 0.Isso foi testado no Android 1.5 a 4.2, mas cuidado com o comprador! Porque esta solução depende de reflexão para chamar o privado
AdapterView.setNextSelectedPositionInt()
eAdapterView.setSelectedPositionInt()
, não é garantido que funcione em futuras atualizações do sistema operacional. Parece provável que sim, mas não é de forma alguma garantido.Normalmente, eu não toleraria algo assim, mas essa pergunta já foi feita várias vezes e parece uma solicitação razoável o suficiente para que eu pensasse em publicar minha solução.
fonte
O que você pode fazer é decorar
SpinnerAdapter
com um que apresente uma exibição 'Selecionar opção ...' inicialmente para que o Spinner seja exibido sem nada selecionado.Aqui está um exemplo de trabalho testado para Android 2.3 e 4.0 (ele não usa nada na biblioteca de compatibilidade, por isso deve ficar bom por um tempo) Como é um decorador, deve ser fácil atualizar o código existente e funciona bem com
CursorLoader
s também. (Trocar o cursor no embrulho, écursorAdapter
claro ...)Há um bug no Android que torna um pouco mais difícil reutilizar visualizações. (Portanto, você deve usar o
setTag
ou qualquer outra coisa para garantir a suaconvertView
correção.) O Spinner não suporta vários tipos de exibiçãoNotas de código: 2 construtores
Isso permite que você use um prompt padrão ou defina seu próprio 'nada selecionado' como a primeira linha, ou ambas, ou nenhuma. (Nota: alguns temas mostram um DropDown para um Spinner em vez de uma caixa de diálogo. O Dropdown normalmente não mostra o prompt)
Você define um layout para 'parecer' como um prompt, por exemplo, esmaecido ...
Usando um prompt padrão (observe que nada está selecionado):
Ou com um prompt e algo dinâmico (poderia não ter nenhum prompt também):
Uso no exemplo acima
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
fonte
Acabei usando um em
Button
vez disso. Enquanto aButton
não é aSpinner
, o comportamento é fácil de personalizar.Primeiro, crie o adaptador como de costume:
Observe que estou usando o
simple_spinner_dropdown_item
como o ID do layout. Isso ajudará a criar uma aparência melhor ao criar a caixa de diálogo de alerta.No manipulador onClick do meu Button, tenho:
E é isso!
fonte
Primeiro, você pode estar interessado no
prompt
atributo daSpinner
classe. Veja a figura abaixo: "Escolha um planeta" é o prompt que pode ser definido no XML comandroid:prompt=""
.Eu sugeriria a subclasse
Spinner
, onde você poderia manter dois adaptadores internamente. Um adaptador que possui a opção "Selecionar um" e o outro adaptador real (com as opções reais), usando oOnClickListener
para alternar os adaptadores antes que a caixa de diálogo de opções seja mostrada. No entanto, depois de tentar implementar essa ideia, cheguei à conclusão de que você não pode receberOnClick
eventos para o próprio widget.Você pode envolver o botão giratório em uma visualização diferente, interceptar os cliques na visualização e solicitar que você
CustomSpinner
troque o adaptador, mas parece um hack terrível.Você realmente precisa mostrar "Select One"?
fonte
Este código foi testado e funciona no Android 4.4
fonte
getItem(getCount())
está sublinhado em vermelho para mim? Não é possível resolver o método setHintEncontrei esta solução:
Apenas mude a matriz [0] com "Selecionar uma" e, em seguida, no onItemSelected, renomeie para "Uma".
Não é uma solução elegante, mas funciona: D
fonte
Não existe uma API padrão para definir dicas no Spinner. Para adicioná-lo, precisamos de uma pequena solução alternativa, sem a implementação da reflexão de segurança
Fonte do adaptador:
Fonte original
fonte
android.R.id.text1
getCount
métodoMuitas respostas aqui, mas estou surpreso que ninguém tenha sugerido uma solução simples: Coloque um TextView em cima do Spinner. Defina um ouvinte de clique no TextView que oculta o TextView mostra o Spinner e chama spinner.performClick ().
fonte
Eu tive o mesmo problema para o spinner, com uma seleção vazia, e encontrei uma solução melhor. Dê uma olhada neste código simples.
Aqui, spinneradapter é uma pequena personalização para o arrayadapter. Se parece com isso:
fonte
Você pode alterá-lo para uma exibição de texto e usar o seguinte:
e depois defina a
android:text
propriedadefonte
Arquivo XML:
Atividade:
onCreate:
Alguma função (adicione itens ao adaptador programaticamente)>
Agora você tem um botão giratório vazio e pode escrever um código para não abrir a caixa de diálogo se estiver vazio. Ou eles podem pressionar de volta. Mas você também a preenche com uma função ou outra lista durante o tempo de execução.
fonte
Eu tentei como o seguinte. Pegue um botão e atribua o evento click. Ao alterar o plano de fundo do botão, parece ser um botão giratório.
Declarar como variáveis globais alertdialog e valor padrão.
fonte
Esse é meu jeito:
fonte
Dê uma olhada no aplicativo iosched para obter uma solução de uso geral para adicionar um elemento ao topo de uma lista. Em particular, se você estiver usando um CursorAdapter, consulte TracksAdapter.java, que estende essa definição para fornecer um método "setHasAllItem" e código associado para gerenciar a contagem de listas e lidar com o item extra na parte superior.
Usando o adaptador personalizado, você pode definir o texto como "Selecionar um" ou o que mais você desejar.
fonte
Eu tenho um botão giratório no meu main.xml e seu ID é
@+id/spinner1
isto é o que eu escrevo na minha função OnCreate:
Não precisa de nenhuma implementação na classe.
fonte
Encontrei muitas boas soluções para isso. a maioria está funcionando adicionando um item ao final do adaptador e não exibe o último item na lista suspensa. O grande problema para mim foi que a lista suspensa giratória começará no final da lista. Assim, o usuário vê os últimos itens em vez dos primeiros (no caso de haver muitos itens para mostrar), depois de tocar no botão giratório pela primeira vez.
Então, eu coloquei o item de dica no início da lista. e oculte o primeiro item na lista suspensa.
defina o layout abaixo em @Override getDropDownView () quando position for 0, para ocultar a primeira linha de dica.
R.layout.spinner_hint_list_item_layout:
fonte
Além disso, há um truque simples para mostrar o padrão:
Você pode adicionar um valor padrão à sua lista e adicionar toda a sua coleção usando
list.addAll(yourCollection);
Exemplo de código viável aqui:
Espero que ele recupere sua complexidade. Feliz codificação!
fonte
Eu acho que a maneira mais fácil é criar um item fictício no índice 0 dizendo "selecione um" e, em seguida, salvar talvez verifique se a seleção não é 0.
fonte
Portanto, este é o meu exemplo final "all-in" para um botão giratório
Em activity_my_form.xml
Em strings.xml
No MyFormActivity.java
Finalmente, obtive um tamanho de fonte configurável, sem o primeiro item selecionável por botão giratório !!! Graças a HRJ
fonte
Ao estender
SpinnerAdapter
, você substitui doisView
métodos de produçãogetView(int, View, ViewGroup)
egetDropDownView(int, View, ViewGroup)
. O primeiro fornece oView
inserido noSpinner
próprio; o segundo fornece aView
lista suspensa (como o nome sugere). Você pode substituir ogetView(...)
item para que, até que um item seja selecionado, ele exiba umTextView
contendo um prompt; quando detectar que um item foi selecionado, altere-o para exibir umTextView
correspondente a ele.fonte
Spinner
tutorial (que supostamente exibe umaToast
depois de ter seleccionado um item) Isso deve funcionar: developer.android.com/resources/tutorials/views/...Para aqueles que usam Xamarin, aqui está o C # equivalente à resposta de aaronvargas acima.
fonte
Também resolvi esse problema usando o código a seguir. Suponha que você esteja tendo uma lista de itens, por exemplo
Agora temos que fornecer as strings para o spinner, porque o spinner não consegue entender o objeto. Então, criaremos uma nova lista de array com itens de string como este ->
Agora temos uma
itemStringArrayList
lista de matrizes com dois itens de sequência. E temos que mostrar o texto "Selecionar item" como primeiro item. Portanto, temos que inserir uma nova string noitemStringArrayList
.Agora temos uma lista de matrizes
itemsArrayList
e queremos mostrar dois elementos no menu suspenso. Mas a condição aqui é ... Se não selecionarmos nada, eleSelect Item
deverá aparecer como o primeiro elemento que não será ativado.Portanto, podemos implementar essa funcionalidade assim. Se você precisar carregar os itens da lista de arrays no Android Spinner. Então você terá que usar algum adaptador. Então aqui eu vou usar o
ArrayAdapter
. Também podemos usar o adaptador de personalização.Aqui neste código. estamos usando o layout giratório personalizado, ou seja
R.layout.spinner_item
. É uma visualização de texto simplesPrecisamos desativar o primeiro texto no botão giratório. Portanto, para a posição 0, estamos desativando o texto. E também podemos definir cores substituindo o método getDropDownView. Portanto, dessa forma, obteremos o spinner esperado.
fonte
Eu usaria um RadioGroup com RadioButtons, se você tiver apenas três opções, poderá desmarcá-las primeiro.
fonte
Nenhuma das respostas enviadas anteriormente realmente funcionou da maneira que eu queria resolver esse problema. Para mim, a solução ideal forneceria o “Select One” (ou qualquer texto inicial) quando o botão giratório for exibido pela primeira vez. Quando o usuário toca no botão giratório, o texto inicial não deve fazer parte da lista suspensa exibida.
Para complicar ainda mais minha situação específica, meus dados giratórios estão chegando de um cursor carregado através dos retornos de chamada do LoaderManager.
Após considerável experimentação, vim com a seguinte solução:
fonte
Eu lido com isso usando um botão em vez de um Spinner. Eu tenho o projeto de amostra no GitHub.
No projeto, estou exibindo o Spinner e o botão para mostrar que eles realmente parecem idênticos. Exceto o botão, você pode definir o texto inicial para o que quiser.
Aqui está a aparência da atividade:
NOTA: Sim, eu sei que isso depende do tema aplicado e a aparência será um pouco diferente se você usar o Theme.Holo. No entanto, se você estiver usando um dos temas herdados, como Theme.Black, estará pronto.
fonte
se você estiver enfrentando esse problema quando seus itens forem preenchidos a partir do cursor do banco de dados ,
a solução mais simples que encontrei nesta resposta SO:
use UNION na consulta do adaptador do cursor e adicione o item adicional com id = -1 ao resultado da consulta, sem realmente adicioná-lo ao banco de dados:
algo como:
se o item selecionado for -1, será o valor padrão. Caso contrário, é um registro da tabela.
fonte
Parece uma solução banal, mas geralmente coloco simplesmente um TextView na frente do botão giratório. O Xml inteiro fica assim. (ei pessoal, não atire em mim, eu sei que alguns de vocês não gostam desse tipo de casamento):
Então, oculto o TextView quando um item foi selecionado. Obviamente, a cor de fundo do TextView deve ser a mesma do Spinner. Funciona no Android 4.0. Não sei em versões mais antigas.
Sim. Como o Spinner chama setOnItemSelectedListener no início, a ocultação da visualização de texto pode ser um pouco complicada, mas pode ser feita desta maneira:
fonte
para mim, funcionou algo assim. tem a melhoria que altera apenas o texto em algumas opções, não em todas.
Primeiro, pego os nomes do girador e crio o adaptador de matriz com uma visualização customizada, mas isso não importa agora, a chave é substituir o getView e, dentro, alterar os valores que você precisa alterar. No meu caso foi apenas o primeiro, o resto deixo o original
fonte
aqui está um simples
fonte
Consulte uma das respostas acima: https://stackoverflow.com/a/23005376/1312796
Eu adicionei meu código para corrigir um pequeno bug. Que onde nenhum dado recuperado .. Como mostrar o texto do prompt ..!
Aqui está o meu truque ... Funciona bem comigo. !
Tente colocar seu botão giratório em um Relative_layout e alinhe um Textview com o botão giratório e brinque com a visibilidade do Textview (SHOW / HIDE) sempre que o adaptador do botão giratório estiver carregado ou vazio.
Aqui está o código:
chame esse método antes e antes do adaptador giratório carregado e vazio.
fonte