Domanda

Ho uno schermo in cui l'utente ha molti elementi da inserire, quindi lo spazio sullo schermo è limitato.

Voglio che l'aspetto del widget sullo schermo (prima che l'utente lo prema) sia simile a un EditText o alla parte sinistra del widget Spinner (senza il normale triangolo in basso) sul lato destro dello Spinner.Quindi, quando l'utente preme il widget, verrà visualizzata la normale finestra di dialogo di selezione dello Spinner.

C'è qualche attributo di stile Spinner che posso modificare per ottenere questo risultato?

Non sono riuscito a vedere un codice come questo.

Grazie

È stato utile?

Soluzione

Una cosa che puoi fare è il codice sorgente introito di Spinner dalla base di codice Android, insieme con layout e le risorse correlate, e li usa per creare il proprio widget personalizzato (probabilmente si avrà solo bisogno di rimuovere la freccia dal layout e ottimizzare la codice un po 'a seconda delle esigenze).

EDIT: Hai ragione, dopo che il post era in realtà molto semplice :) quello che dovete fare due cose. In primo luogo, creare un file styles.xml sotto res / valori, aprirlo e aggiungere la seguente:

<?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>

In seguito, nel layout, aggiungere lo Spinner in questo modo:

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

Ecco fatto, ora il filatore sarà simile a un EditText pianura, senza quella freccia giù inutile e fastidioso.

Altri suggerimenti

Questa è piuttosto una vecchia questione, ma penso ancora attuale, quindi ecco la mia risposta:

Più semplice Metodo

risposta lencinhaus è corretta. Funziona, ma può essere fatto in un modo ancora più semplice: basta aggiungere un altro sfondo ad esso. L'esempio seguente utilizza lo sfondo Button standard per una più omogenea look-and-feel:

<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"
    />       

Lo syle utilizzato nell'altra risposta non più fa che applicare uno sfondo al widget. Che può essere fatto direttamente al widget, risparmiando la necessità di un nuovo file XML. Naturalmente, se avete intenzione di applicare uno stile alla trottola in ogni modo, non c'è niente di sbagliato in questo approccio.

Perché?

La chiave per capire come funziona sta nella descrizione dei PNG 9-patch . Le linee a destra e inferiore vengono utilizzati per il riempimento, cioè, per mantenere un certo spazio venga utilizzato dal suo contenuto. In questo caso, il testo all'interno. Lo sfondo di serie Spinner utilizza un'immagine con una freccia a destra che si trova all'esterno dell'area di testo utilizzabile. Si veda la figura 1 sotto per un esempio:

Figura 1. originale Spinner bacground 9-patch PNG http://tinypic.com/images/404 .gif
Figura 1. Spinner originale bacground 9-patch PNG.

Basta rimuovere la freccia non è sufficiente in quanto l'imbottitura rimane lì. È necessario utilizzare una nuova immagine 9-patch con una ridotta imbottitura (vedi figura 2 per un esempio basato sulla fig. 1) oppure usare una delle precompilata immagini 9-patch senza tanto imbottitura, come quelli per EditText (< strong> @android:drawable/edit_text ) o Button ( @android:drawable/btn_default ).

Figura 2. Modificato Spinner bacground 9-patch PNG con imbottitura ridotta
Spinner Figura 2. Modified bacground 9-patch PNG con imbottitura ridotta.

La comprensione di questo vi permetterà di creare i propri sfondi per il Spinner (e, in effetti, per qualsiasi widget di).

Una migliore spiegazione della 9-patch file può essere trovato qui

E 'molto facile creare i file con il draw9patch eseguibile dal SDK ( leggere su di esso qui ), ma nulla vieta di utilizzare Photoshop o Gimp , invece. Ricordate, PNG 9-patch sono PNG solo semplici! L'unica avvertenza è quella di fare in modo che si disegna solo le linee esterne di pixel e che il resto dei pixel sono completamente trasparenti. Antialiasing vicino al confine potrebbero portare a risultati inaspettati.

Sono appena arrivato a questa domanda, perché la mia filatore non stava mostrando l'indicatore triangolo, ora capisco perché: stavo installando lo sfondo a "bianco":

android:background="#FFFFFFFF"

Questo rimuove l'indicatore del triangolo (l'immagine di sfondo filatore e imbottitura dichiarato dal Aleadam).

Per il mio problema, io risolverlo aggiungendo un LinearLayout genitore solo per impostare lo sfondo per "bianca".

Dategli uno sfondo, la freccia scompare.

android:background="@drawable/bg"

ho avuto lo stesso problema e ha cambiato lo stile a:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

e ha funzionato.

Che strano, la sua posizione in DropDownItem.

Mentre quella che ha il triangolo inferiore è chiamato il normale.

Cheers!

Il problema correlato di spazio attenzione quando si fa clic su realtà filatore, ho trovato per caso che è possibile rimuovere quei grandi indicatori di selezione a destra. È possibile ottenere una lista di base separati da linee, ma è possibile fare clic su un elemento e funziona ancora.

Impostare un filatore come questo per ottenere gli indicatori di selezione:

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

Per nessun indicatore semplicemente lasciare fuori la linea setDropDownViewResource.

perché non apri una finestra di dialogo con list.In base alle tue esigenze, crea un campo di testo di modifica, aggiungi setOnFocusChangeListener e quindi mostra una finestra di dialogo con gli elementi dell'elenco nel metodo onFocusChange().Per il dialogo con gli elementi dell'elenco

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

No risposta è stata utile per me, ecco un molto semplice soluzione di una riga che ha funzionato.

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

Non posso dire di sicuro se funzionerà con solo un layout predefinito filatore, ma ha funzionato bene con la mia personalizzato che ho creato per altre necessità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top