Como criar um girador Android sem triângulo no lado direito do widget
-
27-09-2019 - |
Pergunta
Eu tenho uma tela em que o usuário tem muitos itens para inserir, para que o espaço da tela seja de prêmio.
Eu quero que a aparência do widget na tela (antes que o usuário o pressione) seja semelhante a um EdittExt ou a parte esquerda do widget giratório (sem o triângulo inferior normal) no lado direito do spinner. Então, quando o usuário pressionar o widget, ele/ela receberá a caixa de diálogo Normal de seleção de spinner.
Existe algum atributo de estilo spinner que eu possa mudar para conseguir isso?
Não pude ver o código assim.
Obrigado
Solução
Uma coisa que você pode fazer é levar Spinner
O código -fonte do Android da base do Android, juntamente com layouts e recursos relacionados, e usá -los para criar seu próprio widget personalizado (provavelmente você precisará remover a seta do layout e ajustar o código um pouco, dependendo das suas necessidades).
EDIT: Você está certo, seguindo esse post, foi realmente simples :) Você precisa fazer duas coisas. Primeiro, crie um arquivo styles.xml em res/valores, abra -o e adicione o seguinte:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style parent="@android:style/Widget.Spinner" name="SpinnerAsEditText">
<item name="android:background">@android:drawable/edit_text</item>
</style>
</resources>
Em seguida, no seu layout, adicione o spinner assim:
<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>
É isso, agora o spinner parecerá um EdittExt simples, sem aquela flecha inutilizadora e irritante.
Outras dicas
Esta é uma pergunta bastante antiga, mas acho que ainda é relevante, então aqui está minha resposta:
Método mais simples
A resposta de Lencinhaus está correta. Funciona, mas pode ser feito de uma maneira ainda mais simples: basta adicionar outro fundo. O exemplo abaixo usa o padrão Button
Antecedentes para uma aparência mais homogênea:
<Spinner
android:id="@+id/my_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:prompt="@string/my_prompt"
android:background="@android:drawable/btn_default"
/>
O SYLE usado na outra resposta não passa mais do que aplicar um plano de fundo ao widget. Isso pode ser feito diretamente no widget, economizando a necessidade de um novo arquivo XML. Obviamente, se você vai aplicar um estilo ao spinner de qualquer maneira, não há nada de errado nessa abordagem.
Por quê?
A chave para entender como funciona está na descrição dos 9 PNGs de 9. As linhas à direita e na parte inferior são usadas para preenchimento, ou seja, para impedir que algum espaço seja usado por seu conteúdo. Nesse caso, o texto dentro. O fundo do girador padrão usa uma imagem com uma seta à direita que está fora da área de texto utilizável. Veja a Figura 1 abaixo para uma ilustração:
Figura 1. Spinner original BACground 9-Patch PNG http://tinypic.com/images/404.gif
Figura 1. Original Spinner
BACground 9 Patch PNG.
Apenas remover a flecha não é suficiente, pois o preenchimento permanece lá. Você precisa usar uma nova imagem de 9 patch com um preenchimento diminuído (veja a Figura 2 para um exemplo baseado na Fig. 1) ou usar uma das imagens de 9 patch pré-compiladas sem tanto preenchimento EditText
(@android:drawable/edit_text
) ou Button
(@android:drawable/btn_default
).
Figura 2. modificado Spinner
PNG BACground 9 Patch com estofamento reduzido.
Entender isso permitirá que você crie seus próprios antecedentes para o Spinner
(e, de fato, para qualquer widget).
Uma melhor explicação dos arquivos de 9 patches pode ser encontrado aqui
É muito fácil criar os arquivos com o desenhe9patch executável do SDK (Leia sobre isso aqui), mas nada impede que você use Photoshop ou Gimp em vez de. Lembre-se de que os PNGs de 9 patches são simplesmente PNGs simples! A única ressalva é garantir que você desenhe apenas para as linhas externas dos pixels e que o restante dos pixels seja completamente transparente. Antialiasing próximo à fronteira pode produzir resultados inesperados.
Acabei de chegar a essa pergunta, porque meu spinner não estava mostrando o indicador do triângulo, agora entendo o porquê: eu estava definindo o plano de fundo para "branco":
android:background="#FFFFFFFF"
Isso remove o indicador do triângulo (a imagem e o preenchimento de fundo do spinner declarado por Aleadam).
Para o meu problema, resolvo -o adicionando um pai linearlayout apenas para definir o plano de fundo como "branco".
Dê um fundo, a flecha desaparecerá.
android:background="@drawable/bg"
Eu estava tendo o mesmo problema e mudou o estilo para:
style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"
E funcionou.
Quão estranho está localizado em DropDownItem
.
Enquanto o que possui o triângulo inferior é nomeado o normal.
Felicidades!
Na edição relacionada do espaço tirada quando você realmente clica em Spinner, descobri por acidente que você pode remover esses grandes indicadores de seleção à direita. Você recebe uma lista básica separada por linhas, mas pode clicar em um item e ela ainda funciona.
Configure um spinner como este para obter os indicadores de seleção:
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
this, R.array.petals, android.R.layout.simple_spinner_item);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter1);
Para nenhum indicador, deixe de fora a linha SetDropDownViewResource.
Por que você não vai para uma caixa de diálogo com a lista. De acordo com a sua exigência, crie um campo EdittExt, adicione setonfocuschangelistener e mostre uma caixa de diálogo com itens de lista no método onfocuschange (). Para diálogo com itens de lista
new AlertDialog.Builder(this)
.setTitle("<Title>")
.setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}}).show();
Nenhuma resposta foi útil para mim, então aqui está uma solução de uma linha realmente simples que funcionou.
//some spinner initialisation stuff->
mySpinner.setAdapter(adapter);
//some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
Não sei ter certeza se funcionará apenas com um layout de spinner padrão, mas funcionou bem com o meu costume que criei para outras necessidades.