Come creare uno spinner Android senza triangolo in basso sul lato destro del widget
-
27-09-2019 - |
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
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
).
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à.