Wie kann ich eine Combobox in Android anzeigen?Wie kann ich eine Combobox in Android anzeigen?
Antwort
In android heißt es ein Spinner Sie können sich das Tutorial hier anschauen.
Und das ist eine sehr vage Frage, sollten Sie versuchen, mehr aus Ihrem Problem beschreibend zu sein.
Ich schlage vor, dass Sie dies im Zusammenhang mit Android betrachten Entwicklung. http://www.designersandroid.com/?p=8. Im Kontext von Android Dev wird es als Spinner bezeichnet. Bitte recherchieren Sie das nächste Mal. – gruntled
Ich glaube nicht, dass diese Quelle autorisierend ist. Im Gegenteil, ein bisschen mehr autorisierende Quelle sagt etwas anderes: http://developer.android.com/guide/topics/ui/custom-components.html – vbence
Ja, und wenn Sie auf die Seite schauen, die Sie selbst erstellt haben, können Sie sehen, dass sie es tun Erwähnen Sie eine ComboBox auf dieser Seite, aber in der API gibt es nur einen Verweis auf Spinner (http://developer.android.com/resources/tutorials/views/hello-spinner.html) Hier wird deutlich, dass ein "Spinner ist ein Widget ähnlich einer Dropdown-Liste zum Auswählen von Elementen ". Ich stimme Ihnen zu, dass dies eine ComboBox sein sollte wie bei anderen Java-Implementierungen, aber in diesem Zusammenhang ist es nicht. – gruntled
Nicht getestet, aber je näher Sie kommen können scheint mit 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 nicht getestet wird, kann es einige Merkmale mit der Filtermethode, die ich nicht der Ansicht, aber da haben Sie es , die Grundprinzipien zum Emulieren einer ComboBox mit einer AutoCompleteTextView.
Bearbeiten Feste NullFilter-Implementierung. Wir benötigen Zugriff auf die Elemente, daher muss der Konstruktor des UnconditionalArrayAdapter
einen Verweis auf eine Liste (Art eines Puffers) nehmen. Sie können auch z. adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);
und verwenden Sie dann adapter.add("Luxemburg")
, so dass Sie die Pufferliste nicht verwalten müssen. Hier
Dieser Code kommt dem Kompilieren nicht nahe. Die Aufrufe von getFilter() sehen wie Versuche einer Endlosschleife aus und publishResults gibt einen Wert aus einer void-Methode zurück. Die Idee ist insgesamt gut, aber jemand sollte dieses Beispiel beheben. – dhakim
ist ein Beispiel für 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);
}
}
Hoffe, es hilft !!
Vielen Dank 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? –
Für eine Combobox (http://en.wikipedia.org/wiki/Combo_box), die freie Texteingabe erlaubt und eine Dropdown-Listbox hat, habe ich eine AutoCompleteTextView
verwendet, wie von vbence vorgeschlagen.
Ich habe die onClickListener
verwendet, um das Dropdown-Listenfeld anzuzeigen, wenn der Benutzer das Steuerelement auswählt.
Ich glaube, das ähnelt dieser Art einer 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);
}
Die Fragen sind vollkommen gültig und klar, da Spinner und ComboBox (lesen Sie es: Spinner, wo Sie auch einen benutzerdefinierten Wert liefern können) sind zwei verschiedene Dinge.
Ich war selbst auf der Suche nach dem gleichen und ich war nicht zufrieden mit den gegebenen Antworten. Also habe ich mein eigenes Ding erschaffen. Vielleicht finden einige die folgenden Hinweise nützlich. Ich stelle nicht den vollständigen Quellcode zur Verfügung, da ich einige ältere Aufrufe in meinem eigenen Projekt verwende. Es sollte sowieso ziemlich klar sein. Hier
ist der Screenshot der letzten Sache:
Das erste, was eine Ansicht zu erstellen war, die die gleiche wie die Spinner aussehen wird, die noch nicht ausgebaut. Im Screenshot oben auf dem Bildschirm (nicht im Fokus) können Sie den Spinner und die benutzerdefinierte Ansicht darunter sehen. Zu diesem Zweck habe ich LinearLayout (eigentlich habe ich von Linear Layout geerbt) mit style="?android:attr/spinnerStyle"
.LinearLayout enthält TextView mit style="?android:attr/spinnerItemStyle"
. Komplettes XML-Snippet wäre:
Wie bereits erwähnt, erbt ComboBox von LinearLayout. Es implementiert auch OnClickListener, der ein Dialogfeld mit einer benutzerdefinierten Ansicht erstellt, die aus der XML-Datei aufgebläht 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 Zuhörer, die Sie implementieren müssen: onItemClick für die Liste und onClick für die Schaltfläche. Beide legen den ausgewählten Wert fest und schließen den Dialog.
Für die Liste, möchten Sie es genauso wie erweitert Spinner suchen, können Sie tun, dass die Liste Adapter mit dem entsprechenden (Spinner) Stil wie das Bereitstellen:
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(
activity,
android.R.layout.simple_spinner_dropdown_item,
states
);
Mehr oder weniger, das sollte sei es.
Sieht gut aus. Ich versuche, Ihre Lösung zu implementieren, aber ich bin neu in der Android-Entwicklung, und ich bin ein wenig verwirrt darüber, wo ich die Snippets einfügen soll. Würden Sie etwas überarbeiten, um zu erklären, wie Sie es implementieren? –
Custom made :) Sie können Drop-Down-hori/vertikale Offset-Eigenschaften verwenden, um die Liste derzeit zu positionieren, auch versuchen Android: spinnerMode = "Dialog" ist es Kühler.
Layout-
<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>
Java
//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();
}
});
res/Werte/string
<string-array name="myarray">
<item>value1</item>
<item>value2</item>
</string-array>
War das nützlich ??
Bitte erläutern Sie klarer, was Sie wollen. Und was hast du schon versucht. – fretje
@fretje Die Frage ist ziemlich spezifisch. Wenn Sie wissen, was eine ** ComboBox ** ist, brauchen Sie keine Erklärung. Wenn du es nicht kannst, kannst du es trotzdem googeln: http://en.wikipedia.org/wiki/Combo_box – vbence
@vbene: Ich habe nicht über die ComboBox gesprochen. Da es sich bei Android um ein Betriebssystem handelt, könnte man auch "Wie zeige ich eine Combobox in Windows" fragen, was überhaupt nicht spezifisch ist. – fretje