Bitte erklären Sie klarer, was Sie wollen. Und was du schon versucht hast.
Fretje
30
@fretje Die Frage ist ziemlich spezifisch. Wenn Sie wissen, was eine ComboBox ist, brauchen Sie keine Erklärung. Wenn Sie dies nicht tun, können Sie es trotzdem googeln: en.wikipedia.org/wiki/Combo_box
vbence
1
@vbence: Ich habe nicht über die ComboBox gesprochen. Da Android ein Betriebssystem ist, können Sie auch fragen, wie eine Combobox in Windows angezeigt werden soll, was überhaupt nicht spezifisch ist.
Fretje
18
@fretje Für Windows wäre es aus offensichtlichen Gründen nicht spezifisch genug (Sie können es mit C # oder Delphi usw. tun), aber unter Android sprechen Sie von einem einzigen Entwicklungsframework. Wenn Sie über Android sprechen , ist es genauso spezifisch wie Visual Basic .Net .
Ich schlage vor, Sie betrachten dies im Zusammenhang mit der Android-Entwicklung. designerandroid.com/?p=8 . Im Kontext von Android Dev wird es als Spinner bezeichnet. Bitte recherchieren Sie das nächste Mal.
grunzte
3
Ja, und wenn Sie sich die Website ansehen, die Sie selbst bereitgestellt haben, können Sie feststellen, dass eine ComboBox auf dieser Seite erwähnt wird. In der API wird jedoch nur auf Spinner verwiesen ( developer.android.com/resources/tutorials/views/…. ) Hier wird deutlich, dass ein "Spinner ein Widget ist, das einer Dropdown-Liste zum Auswählen von Elementen ähnelt". Ich stimme Ihnen zu, dass dies wie bei anderen Java-Implementierungen als ComboBox bezeichnet werden SOLLTE, in diesem Zusammenhang jedoch nicht.
grunzte
3
Ich verstehe, dass sich die Metapher mit mobilen Benutzeroberflächen ein wenig ändert. Es gibt neue Widgets (Steuerelemente), mit denen der begrenzte Bildschirmbereich besser genutzt werden kann. Ich denke, deshalb sind die verwendeten neuen Namen für einige Steuerelemente, die bekannt sind, aus der Desktop-Metapher. - Ich stimme zu, dass der Spinner der Dropdown-Liste ähnlich ist. Der Hauptunterschied zwischen der ListBox (Dropdown-Liste) und der ComboBox besteht jedoch darin, dass das Kombinationsfeld im Grunde ein Texteingabefeld ist, das mit der Möglichkeit erweitert wird, aus der Liste auszuwählen . Sie können entweder ein Element aus der Liste auswählen oder beliebige Werte eingeben.
Vbence
15
Hören Sie auf zu picken und geben Sie zu, dass jeder Probleme hatte, ein Steuerelement zu finden, das sich beim ersten Schreiben einer Android-App wie ein Kombinationsfeld oder ein Listenfeld verhält ...
Torp
11
Ich suche immer noch nach einem Kombinationsfeld. Ich habe Spinner gesehen. Gebrauchte Spinner. Aber ehrlich gesagt habe ich ein Szenario, in dem ich den Text auf etwas anderes als eine bestimmte Option setzen muss. Aka können sie es eingeben. Spinner sind keine Kombinationsfelder, aber normalerweise eine gültige Alternative.
IAmGroot
11
Hier ist ein Beispiel für eine benutzerdefinierte Combobox in Android:
package myWidgets;
import android.content.Context;
import android.database.Cursor;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SimpleCursorAdapter;
publicclassComboBoxextendsLinearLayout{
private AutoCompleteTextView _text;
private ImageButton _button;
publicComboBox(Context context) {
super(context);
this.createChildControls(context);
}
publicComboBox(Context context, AttributeSet attrs) {
super(context, attrs);
this.createChildControls(context);
}
privatevoidcreateChildControls(Context context) {
this.setOrientation(HORIZONTAL);
this.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
_text = new AutoCompleteTextView(context);
_text.setSingleLine();
_text.setInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_VARIATION_NORMAL
| InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
| InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE
| InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
_text.setRawInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
this.addView(_text, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, 1));
_button = new ImageButton(context);
_button.setImageResource(android.R.drawable.arrow_down_float);
_button.setOnClickListener(newOnClickListener() {
@OverridepublicvoidonClick(View v) {
_text.showDropDown();
}
});
this.addView(_button, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
/**
* Sets the source for DDLB suggestions.
* Cursor MUST be managed by supplier!!
* @param source Source of suggestions.
* @param column Which column from source to show.
*/publicvoidsetSuggestionSource(Cursor source, String column) {
String[] from = newString[] { column };
int[] to = new int[] { android.R.id.text1 };
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this.getContext(),
android.R.layout.simple_dropdown_item_1line, source, from, to);
// this is to ensure that when suggestion is selected// it provides the value to the textbox
cursorAdapter.setStringConversionColumn(source.getColumnIndex(column));
_text.setAdapter(cursorAdapter);
}
/**
* Gets the text in the combo box.
*
* @return Text.
*/publicStringgetText() {
return _text.getText().toString();
}
/**
* Sets the text in combo box.
*/publicvoidsetText(String text) {
_text.setText(text);
}
}
Danke für Ihre Antwort. Ich möchte dieses Widget verwenden, aber ich möchte ein Array von String als Datenquelle und nicht als Cursor verwenden. was soll ich machen?
Ali Behzadian Nejad
7
Nicht getestet, aber je näher Sie kommen, desto besser ist AutoCompleteTextView . Sie können einen Adapter schreiben, der die Filterfunktionen ignoriert. Etwas wie:
classUnconditionalArrayAdapter<T>extendsArrayAdapter<T>{
finalList<T> items;
public UnconditionalArrayAdapter(Context context, int textViewResourceId, List<T> items) {
super(context, textViewResourceId, items);
this.items = items;
}
public Filter getFilter() {
returnnewNullFilter();
}
classNullFilterextendsFilter{
protectedFilter.FilterResults performFiltering(CharSequence constraint) {
finalFilterResults results = newFilterResults();
results.values = items;
return results;
}
protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
items.clear(); // `items` must be final, thus we need to copy the elements by hand.for (Object item : (List) results.values) {
items.add((String) item);
}
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
Der Code wird nicht getestet, es kann einige Funktionen mit der Filtermethode geben, die ich nicht berücksichtigt habe, aber da haben Sie die Grundprinzipien, um eine ComboBox mit einer AutoCompleteTextView zu emulieren.
Bearbeiten Sie die
feste NullFilter-Implementierung. Wir benötigen Zugriff auf die Elemente, daher muss der Konstruktor der UnconditionalArrayAdapterVerweise auf eine Liste (eine Art Puffer) verweisen. Sie können auch zB adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);und dann verwenden adapter.add("Luxemburg"), sodass Sie die Pufferliste nicht verwalten müssen.
Dieser Code kommt dem Kompilieren nicht nahe. Die Aufrufe von getFilter () sehen aus wie Versuche einer Endlosschleife, und PublishResults gibt einen Wert von einer void-Methode zurück. Die Idee ist insgesamt gut, aber jemand sollte dieses Beispiel korrigieren.
Dhakim
6
Die Fragen sind absolut gültig und klar, da Spinner und ComboBox (lesen Sie: Spinner, wo Sie auch einen benutzerdefinierten Wert angeben können) zwei verschiedene Dinge sind.
Ich habe selbst nach dem gleichen gesucht und war mit den gegebenen Antworten nicht zufrieden. Also habe ich mein eigenes Ding kreiert. Vielleicht finden einige die folgenden Hinweise nützlich. Ich stelle nicht den vollständigen Quellcode bereit, da ich einige Legacy-Aufrufe in meinem eigenen Projekt verwende. Es sollte sowieso ziemlich klar sein.
Hier ist der Screenshot der letzten Sache:
Das erste war, eine Ansicht zu erstellen, die genauso aussieht wie der Spinner, der noch nicht erweitert wurde. Im Screenshot sehen Sie oben auf dem Bildschirm (unscharf) den Drehfeld und die benutzerdefinierte Ansicht rechts darunter. Zu diesem Zweck habe ich LinearLayout (eigentlich habe ich von Linear Layout geerbt) mit verwendet style="?android:attr/spinnerStyle". LinearLayout enthält TextView mit style="?android:attr/spinnerItemStyle". Ein vollständiges XML-Snippet wäre:
Wie bereits erwähnt, erbt ComboBox von LinearLayout. Außerdem wird OnClickListener implementiert, mit dem ein Dialogfeld mit einer benutzerdefinierten Ansicht erstellt wird, die aus der XML-Datei aufgeblasen wird. Hier ist die aufgeblasene Ansicht:
Es gibt zwei weitere Listener, die Sie implementieren müssen: onItemClick für die Liste und onClick für die Schaltfläche. Beide setzen den ausgewählten Wert und schließen den Dialog.
Wenn die Liste genauso aussehen soll wie der erweiterte Spinner, können Sie dies tun, indem Sie dem Listenadapter den entsprechenden (Spinner-) Stil wie folgt geben:
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(
activity,
android.R.layout.simple_spinner_dropdown_item,
states
);
Sieht gut aus. Ich versuche, Ihre Lösung zu implementieren, aber ich bin neu in der Android-Entwicklung und ein bisschen verwirrt darüber, wo die Snippets abgelegt werden sollen. Würde es Ihnen etwas ausmachen, ein wenig zu überarbeiten, um zu erklären, wie es implementiert wird?
You'reAGitForNotUsingGit
4
Custom made :) Sie können Dropdown-Hori / vertikale Offset-Eigenschaften verwenden, um die Liste aktuell zu positionieren. Versuchen Sie auch android: spinnerMode = "dialog" es ist cooler.
Wie ist deine Antwort? Wo klicken Sie auf AutoCompleteTextView und zeigen?
ZarNi Myo Sett Win
Sie können AutoCompleteTextView oder Spinner nach Belieben um zusätzliche Ereignisse erweitern.
ShakKiR
0
Für eine Combobox ( http://en.wikipedia.org/wiki/Combo_box ), die freie Texteingabe ermöglicht und eine Dropdown-Listbox hat, habe ich eine verwendet, AutoCompleteTextViewwie von vbence vorgeschlagen.
Ich habe das verwendet onClickListener, um das Dropdown-Listenfeld anzuzeigen, wenn der Benutzer das Steuerelement auswählt.
Ich glaube, das ähnelt dieser Art von Combobox am besten.
privatestatic final String[] STUFF = newString[] { "Thing 1", "Thing 2" };
publicvoidonCreate(Bundle b) {
final AutoCompleteTextView view =
(AutoCompleteTextView) findViewById(R.id.myAutoCompleteTextView);
view.setOnClickListener(new View.OnClickListener()
{
@OverridepublicvoidonClick(View v)
{
view.showDropDown();
}
});
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_dropdown_item_1line,
STUFF
);
view.setAdapter(adapter);
}
Antworten:
In Android heißt es Spinner. Sie können sich das Tutorial hier ansehen.
Hallo Spinner
Und dies ist eine sehr vage Frage. Sie sollten versuchen, Ihr Problem genauer zu beschreiben.
quelle
Hier ist ein Beispiel für eine benutzerdefinierte Combobox in Android:
package myWidgets; import android.content.Context; import android.database.Cursor; import android.text.InputType; import android.util.AttributeSet; import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.SimpleCursorAdapter; public class ComboBox extends LinearLayout { private AutoCompleteTextView _text; private ImageButton _button; public ComboBox(Context context) { super(context); this.createChildControls(context); } public ComboBox(Context context, AttributeSet attrs) { super(context, attrs); this.createChildControls(context); } private void createChildControls(Context context) { this.setOrientation(HORIZONTAL); this.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); _text = new AutoCompleteTextView(context); _text.setSingleLine(); _text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); _text.setRawInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); this.addView(_text, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1)); _button = new ImageButton(context); _button.setImageResource(android.R.drawable.arrow_down_float); _button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { _text.showDropDown(); } }); this.addView(_button, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } /** * Sets the source for DDLB suggestions. * Cursor MUST be managed by supplier!! * @param source Source of suggestions. * @param column Which column from source to show. */ public void setSuggestionSource(Cursor source, String column) { String[] from = new String[] { column }; int[] to = new int[] { android.R.id.text1 }; SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this.getContext(), android.R.layout.simple_dropdown_item_1line, source, from, to); // this is to ensure that when suggestion is selected // it provides the value to the textbox cursorAdapter.setStringConversionColumn(source.getColumnIndex(column)); _text.setAdapter(cursorAdapter); } /** * Gets the text in the combo box. * * @return Text. */ public String getText() { return _text.getText().toString(); } /** * Sets the text in combo box. */ public void setText(String text) { _text.setText(text); } }
Ich hoffe es hilft!!
quelle
Nicht getestet, aber je näher Sie kommen, desto besser ist AutoCompleteTextView . Sie können einen Adapter schreiben, der die Filterfunktionen ignoriert. Etwas wie:
class UnconditionalArrayAdapter<T> extends ArrayAdapter<T> { final List<T> items; public UnconditionalArrayAdapter(Context context, int textViewResourceId, List<T> items) { super(context, textViewResourceId, items); this.items = items; } public Filter getFilter() { return new NullFilter(); } class NullFilter extends Filter { protected Filter.FilterResults performFiltering(CharSequence constraint) { final FilterResults results = new FilterResults(); results.values = items; return results; } protected void publishResults(CharSequence constraint, Filter.FilterResults results) { items.clear(); // `items` must be final, thus we need to copy the elements by hand. for (Object item : (List) results.values) { items.add((String) item); } if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } }
... dann in Ihrem onCreate:
String[] COUNTRIES = new String[] {"Belgium", "France", "Italy", "Germany"}; List<String> contriesList = Arrays.asList(COUNTRIES()); ArrayAdapter<String> adapter = new UnconditionalArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, contriesList); AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list); textView.setAdapter(adapter);
Der Code wird nicht getestet, es kann einige Funktionen mit der Filtermethode geben, die ich nicht berücksichtigt habe, aber da haben Sie die Grundprinzipien, um eine ComboBox mit einer AutoCompleteTextView zu emulieren.
Bearbeiten Sie die feste NullFilter-Implementierung. Wir benötigen Zugriff auf die Elemente, daher muss der Konstruktor der
UnconditionalArrayAdapter
Verweise auf eine Liste (eine Art Puffer) verweisen. Sie können auch zBadapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);
und dann verwendenadapter.add("Luxemburg")
, sodass Sie die Pufferliste nicht verwalten müssen.quelle
Die Fragen sind absolut gültig und klar, da Spinner und ComboBox (lesen Sie: Spinner, wo Sie auch einen benutzerdefinierten Wert angeben können) zwei verschiedene Dinge sind.
Ich habe selbst nach dem gleichen gesucht und war mit den gegebenen Antworten nicht zufrieden. Also habe ich mein eigenes Ding kreiert. Vielleicht finden einige die folgenden Hinweise nützlich. Ich stelle nicht den vollständigen Quellcode bereit, da ich einige Legacy-Aufrufe in meinem eigenen Projekt verwende. Es sollte sowieso ziemlich klar sein.
Hier ist der Screenshot der letzten Sache:
Das erste war, eine Ansicht zu erstellen, die genauso aussieht wie der Spinner, der noch nicht erweitert wurde. Im Screenshot sehen Sie oben auf dem Bildschirm (unscharf) den Drehfeld und die benutzerdefinierte Ansicht rechts darunter. Zu diesem Zweck habe ich LinearLayout (eigentlich habe ich von Linear Layout geerbt) mit verwendet
style="?android:attr/spinnerStyle"
. LinearLayout enthält TextView mitstyle="?android:attr/spinnerItemStyle"
. Ein vollständiges XML-Snippet wäre:<com.example.comboboxtest.ComboBox style="?android:attr/spinnerStyle" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView" style="?android:attr/spinnerItemStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" android:text="January" android:textAlignment="inherit" /> </com.example.comboboxtest.ComboBox>
Wie bereits erwähnt, erbt ComboBox von LinearLayout. Außerdem wird OnClickListener implementiert, mit dem ein Dialogfeld mit einer benutzerdefinierten Ansicht erstellt wird, die aus der XML-Datei aufgeblasen wird. Hier ist die aufgeblasene Ansicht:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:hint="Enter custom value ..." > <requestFocus /> </EditText> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="OK" /> </LinearLayout> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
Es gibt zwei weitere Listener, die Sie implementieren müssen: onItemClick für die Liste und onClick für die Schaltfläche. Beide setzen den ausgewählten Wert und schließen den Dialog.
Wenn die Liste genauso aussehen soll wie der erweiterte Spinner, können Sie dies tun, indem Sie dem Listenadapter den entsprechenden (Spinner-) Stil wie folgt geben:
ArrayAdapter<String> adapter = new ArrayAdapter<String>( activity, android.R.layout.simple_spinner_dropdown_item, states );
Mehr oder weniger sollte das so sein.
quelle
Custom made :) Sie können Dropdown-Hori / vertikale Offset-Eigenschaften verwenden, um die Liste aktuell zu positionieren. Versuchen Sie auch android: spinnerMode = "dialog" es ist cooler.
<LinearLayout android:layout_marginBottom="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <AutoCompleteTextView android:layout_weight="1" android:id="@+id/edit_ip" android:text="default value" android:layout_width="0dp" android:layout_height= "wrap_content"/> <Spinner android:layout_marginRight="20dp" android:layout_width="30dp" android:layout_height="50dp" android:id="@+id/spinner_ip" android:spinnerMode="dropdown" android:entries="@array/myarray"/> </LinearLayout>
//set auto complete final AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit_ip); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.myarray)); textView.setAdapter(adapter); //set spinner final Spinner spinner = (Spinner) findViewById(R.id.spinner_ip); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { textView.setText(spinner.getSelectedItem().toString()); textView.dismissDropDown(); } @Override public void onNothingSelected(AdapterView<?> parent) { textView.setText(spinner.getSelectedItem().toString()); textView.dismissDropDown(); } });
<string-array name="myarray"> <item>value1</item> <item>value2</item> </string-array>
War das nützlich?
quelle
Für eine Combobox ( http://en.wikipedia.org/wiki/Combo_box ), die freie Texteingabe ermöglicht und eine Dropdown-Listbox hat, habe ich eine verwendet,
AutoCompleteTextView
wie von vbence vorgeschlagen.Ich habe das verwendet
onClickListener
, um das Dropdown-Listenfeld anzuzeigen, wenn der Benutzer das Steuerelement auswählt.Ich glaube, das ähnelt dieser Art von Combobox am besten.
private static final String[] STUFF = new String[] { "Thing 1", "Thing 2" }; public void onCreate(Bundle b) { final AutoCompleteTextView view = (AutoCompleteTextView) findViewById(R.id.myAutoCompleteTextView); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { view.showDropDown(); } }); final ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_dropdown_item_1line, STUFF ); view.setAdapter(adapter); }
quelle