Nach der Verwendung der Android Design Support Library TextInputLayout um eine schwebende Beschriftung über einem zu platzieren EditText Komponente, ich habe mich gefragt, ob es eine Möglichkeit gibt, der Spinner Komponente (nicht unbedingt mit der Design Library).
Damit meine ich so etwas wie a TextView oberhalb platziert Spinner (Offensichtlich keine Animationen wie die TextInputLayout), aber ich möchte die Textgröße, Schriftart und Farbe an die des anpassen TextInputLayoutFloating-Label von.
Zum Beispiel würde es ungefähr so aussehen (siehe die Beschriftungen über der Spinners):
Wie ich bereits erwähnt habe, ist mein Hauptziel, ein Etikett über dem zu haben Spinnergenauso wie in der TextInputLayout – Textgröße, Schriftart, Farbe und Abstände zwischen Beschriftung und Bauteil wären also gleich.
Auf der Google Design-Seite zu Floating-Label-Textfelderngibt es ein Diagramm, das die Abmessungen des Etiketts relativ zur Komponente zeigt, aber es gibt keinen Hinweis auf die Farbe oder Größe des Etiketttexts:
Zusammenfassend frage ich also:
– Wenn es eine spezielle Komponente gibt, um das zu erreichen, was ich verlange, oder eine benutzerdefinierte Ansicht, die ich verwenden kann, welche wäre das und wie kann ich sie verwenden.
– Wenn nicht, wie ist die Textgröße, Farbe und Schriftart des schwebenden Etiketts, damit ich es platzieren kann? TextView über meiner Spinner mit den im obigen Bild gezeigten Layoutabmessungen.
Hinweis- und Eingabeschrift: Roboto Regular 16sp
Etikettenschrift: Roboto Regular 12sp
Kachelhöhe: 72dp
Text oben und unten auffüllen: 16dp
Textfeld-Trennerfüllung: 8dp
sowie die oben gezeigten Bilder.
Die Floating-Label-Schriftart lautet also: Roboto Regular 12sp. Sie können daher a verwenden TextView um die anzuzeigen Spinner beschriften, da mir kein Brauch bekannt ist Views oder spezielle Komponenten, die Sie verwenden könnten.
Jedoch, nach dem Ausprobieren sieht es nicht ganz so gut aus wie das im Bild gezeigte Beispiel. EIN Die benutzerdefinierte Ansicht ist dafür möglicherweise besser geeignetda es schöner aussehen könnte, aber die obige Lösung ist nur eine Möglichkeit, etwas zu erreichen, das dem entspricht, was ich ursprünglich wollte.
Andrea Lazzarotto
Ich will das Textgröße, Schriftart und Farbe an die des anpassen TextInputLayoutFloating-Label von.
Dies kann einfach ohne externe Bibliotheken erreicht werden. Nach dem Versuch, die zu hacken TextInputLayout und selbst beim Erstellen meiner eigenen benutzerdefinierten Ansicht wurde mir klar, dass die Verwendung einer einfachen TextView benötigt viel weniger Code und ist wahrscheinlich effizienter.
Der Textstil kopiert werden können von dem AppCompat Bibliothek.
Der Style
Aus den Material Design Guidelines erhalten wir folgende Informationen:
Das Etikett sollte einen unteren Rand von haben 8dp
Die Beschriftung sollte vertikal am Eingabetext ausgerichtet sein
Folgendes wird in den Richtlinien zum Material nicht erwähnt EditText:
es hat eine linke Polsterung von 4dp
Sein Etikett hat eigentlich keinen Abstand von 16dp Darüber bleibt dies dem Schnittstellendesigner überlassen: Dies ist sinnvoll, da Sie es unter einem anderen platzieren EditTextSie benötigen nur eine zusätzliche 8dp Raum
Darüber hinaus enthält die Design Support Library diesen Stil für die Beschriftung eines fokussierten Elements:
Wenn Sie möchten, dass die Beschriftung immer die hervorgehobene (Akzent-) Farbe hat, ersetzen Sie TextAppearance.AppCompat.Caption mit TextAppearance.Design.Hint aus der Google Design Support Library. Dies wird jedoch wahrscheinlich etwas seltsam aussehen, wenn Sie es auch beschriftet haben EditText Ansichten auf demselben Bildschirm.
Schließlich können Sie a setzen TextView über deinem Spinner (oder ein anderes Element) mit dem angewendeten Stil:
Der folgende Screenshot zeigt ein einfaches Beispiel mit zwei normalen TextInputLayout Ansichten, gefolgt von einem Label und a Spinner. Ich habe die zusätzliche nicht angewendet 8dp Abstand, um sie weiter zu trennen, aber dies zeigt Ihnen, dass Größe, Schriftart und Farbe widergespiegelt werden.
Die Elemente innerhalb der Spinner haben eine andere Polsterung, aber ich bevorzuge es, die vertikale Ausrichtung mit allen anderen Beschriftungen beizubehalten, um ein einheitlicheres Aussehen zu erhalten.
Ja, es ist durchaus möglich, dies ohne externe Bibliotheken zu erreichen. Tatsächlich habe ich beim Erstellen meiner benutzerdefinierten Ansicht denselben Ansatz verwendet, bei dem es sich eigentlich um eine zusammengesetzte Ansicht handelt, die aus der formatierten TextView-, Spinner- und Teileransicht besteht. Der Grund, warum ich die benutzerdefinierte Ansicht erstellt habe, war, dass sie einfacher als eine Ansicht in der Layouthierarchie verwaltet werden kann, anstatt zu versuchen, zwei oder drei Ansichten zu verwalten.
– Farbod Salamat-Zadeh
12. August 2016 um 11:51 Uhr
Sie möchten wahrscheinlich hinzufügen <item name="android:textColor">?android:textColorHint</item> in Ihrem Stil, um dieselbe Textfarbe in der benutzerdefinierten Beschriftung zu erhalten, die in TextInputLayout im unfokussierten Zustand verwendet wird.
– se.solowjew
28. April 2017 um 7:23 Uhr
„Allerdings sieht das wahrscheinlich etwas seltsam aus, wenn Sie auf demselben Bildschirm auch beschriftete EditText-Ansichten haben.“… Sie können einfach spezifisch sein und den Stil benennen SpinnerLabel Anstatt von InputLabel sodass Sie sie nur für Spinner verwenden.
– Robin Hood
9. Oktober 2019 um 8:34 Uhr
“Die Elemente im Spinner haben eine andere Polsterung, aber ich ziehe es vor, die vertikale Ausrichtung mit allen anderen Etiketten beizubehalten, um ein einheitlicheres Aussehen zu erhalten.” Wenn Sie dennoch dieselbe linke Polsterung auf das Etikett anwenden möchten, sodass es an den Spinner-Elementen ausgerichtet ist, lautet der Wert 8dpwie beschrieben hier.
– Omar Sharaki
6. Mai 2021 um 11:07 Uhr
Ich habe dies erreicht, indem ich eine AutoCompleteTextView verwendet, die Tastatur deaktiviert und die Optionen bei Berührung angezeigt habe.
Das ist mit Abstand die beste Lösung. Dies ist ein kleiner Hack und ermöglicht die Verwendung des Standards TextInputLayoutwodurch sichergestellt wird, dass Sie genau das richtige Aussehen haben.
– Vorstand
27. September 2017 um 12:46 Uhr
Nur eine kleine Verbesserung: verwenden R.layout.support_simple_spinner_dropdown_item Anstatt von android.R.layout.simple_spinner_item
– Vorstand
27. September 2017 um 12:46 Uhr
Sehr cleverer Hack. Aber es ist immer noch ein Hack.
– Sewastjan Savanyuk
10. November 2017 um 15:23 Uhr
Wenn du benutzt mTextView.setText(...)erhalten Sie nicht alle Werte vom Adapter in der Dropdown-Liste … Aufruf adapter.getFilter().filter(null); zeigt noch einmal alle Vorschläge
– Maresmar
2. Mai 2018 um 0:48 Uhr
Auch wenn Sie Text festlegen, können Sie das Dropdown-Menü nicht programmgesteuert schließen
– Mike6679
14. Mai 2018 um 14:23 Uhr
Ich habe einen Kern von mir gemacht, um das gleiche Problem zu lösen, das Sie haben.
Jetzt brauche ich keine Spinner. Sie haben immer noch einen Floating-Label-Effekt mit enthaltenen Animationen.
Was genau meinst du mit “Ich brauche keine Spinner”und wo in Ihrem Kern, sagen Sie “Wird verwendet, um Ihren EditText zu einer besseren Option als Spinner zu machen”? Ist die Benutzeroberfläche einfach ein EditText?
– Farbod Salamat-Zadeh
2. August 2015 um 21:18 Uhr
Ich verwende EditText mit TextInput Layout als Alternative für Spinner. Wenn der Benutzer auf diesen benutzerdefinierten EditText klickt, öffne ich einen Dialog mit Optionen zur Auswahl. Natürlich könnte es besser sein und ich akzeptiere jede Verbesserung, um die Optionen mit anderen Arten von Ansichten zu zeigen, genau wie Spinner.
– Rodrigo Henriques
2. August 2015 um 21:35 Uhr
Ich werde diesen Kern in ein Github-Projekt mit Beispielen upgraden, dann hoffe ich, Hilfe zu bekommen, um diese Lösung zu verbessern.
– Rodrigo Henriques
9. August 2015 um 2:00 Uhr
Hinzufügen setInputType(InputType.TYPE_NULL); zum onDraw(canvas) Methode, um jegliche Eingabe in den Bearbeitungstext zu deaktivieren. Andernfalls rufen zB lange Klicks ein Kontextmenü auf und ermöglichen dem Benutzer das Einfügen von Text.
– Steinbock
26. November 2015 um 22:39 Uhr
Nun, das war großartig, aber wenn Sie sich jemals entschieden haben, es in eine Github-Bibliothek zu aktualisieren, stellen Sie sicher, dass Sie eine Option zur Auswahl haben EditText oder AppCompatEditTextbitte !
– Muhammad Naderi
27. Dezember 2015 um 6:05 Uhr
Farbod Salamat-Zadeh
Ich habe eine Verbindung erstellt View Komponente, die ein Label über dem anzeigt Spinner. Der Text für das Etikett kann über XML oder in Java gesetzt werden.
Die Komponente hat die Hauptmerkmale einer Spinner (nicht alle von ihnen) sowie ähnlich aussehen wie die TextInputLayout Komponente.
AKTUALISIEREN:
Nicht bearbeitbare Variante: Deaktivieren Sie die Benutzereingabe in der *AutoCompleteTextView* um eine nicht bearbeitbare Variation des Menüs durch Einstellung zu haben android:inputType="none" auf der AutoCompleteTextView.
Ich habe eine alternative Lösung, die das Verhalten von TextInputLayout und ein benutzerdefiniertes DialogFragment (AlertDialog) verwendet, um ein Spinner-Dialog-Popup zu emulieren.
Benutzerdefinierten Spinner über DialogFragment erstellen (AlertDialog)
SpinnerFragment.java:
public class SpinnerFragment extends DialogFragment {
private static final String TITLEID = "titleId";
private static final String LISTID = "listId";
private static final String EDITTEXTID = "editTextId";
public static SpinnerFragment newInstance(int titleId, int listId, int editTextId) {
Bundle bundle = new Bundle();
bundle.putInt(TITLEID, titleId);
bundle.putInt(LISTID, listId);
bundle.putInt(EDITTEXTID, editTextId);
SpinnerFragment spinnerFragment = new SpinnerFragment();
spinnerFragment.setArguments(bundle);
return spinnerFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final int titleId = getArguments().getInt(TITLEID);
final int listId = getArguments().getInt(LISTID);
final int editTextId = getArguments().getInt(EDITTEXTID);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
try {
final String[] items = getResources().getStringArray(listId);
builder.setTitle(titleId)
.setItems(listId, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int pos) {
EditText et = (EditText) getActivity().findViewById(editTextId);
String selectedText = items[pos];
if (!TextUtils.isEmpty(selectedText)) {
et.setText(selectedText);
} else {
et.getText().clear();
}
}
});
} catch (NullPointerException e) {
Log.e(getClass().toString(), "Failed to select option in " + getActivity().toString() + " as there are no references for passed in resource Ids in Bundle", e);
Toast.makeText(getActivity(), getString(R.string.error_failed_to_select), Toast.LENGTH_LONG).show();
}
return builder.create();
}
Wenn Sie auf das TextInputLayout im Spinner-Stil klicken, wird ein Warndialog mit Ihrer Auswahlliste ausgelöst. Sobald eine Auswahl getroffen wurde, wird der EditText mit Ihrer Auswahl gefüllt und das Etikett schwebt so, wie Sie es möchten.
Nicht android:focusable="false" diese Ansicht für Benutzer unzugänglich machen, die Tastatur oder Sprache verwenden, um mit der App zu interagieren?
– sarga
21. April 2017 um 18:09 Uhr
Ich habe noch nie Tastatur oder Stimme verwendet, um mit einem Spinner zu interagieren, aber der Grund, warum ich eingestellt habe android:focusable="false" Dies ist so, dass der Benutzer keine Eingabe eingeben kann, die nicht in der Auswahl enthalten ist. Leider habe ich kein physisches Android-Telefon, um das Verhalten zu testen und Sie darüber zu informieren.
– Kenny Li
22. April 2017 um 19:27 Uhr
12993900cookie-checkSo fügen Sie Spinner ein Floating-Label hinzuyes