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

Foi útil?

Solução

Uma coisa que você pode fazer é levar SpinnerO 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).

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
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.

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