如何在Android中显示combobox?

如何在Android中显示combobox?

在Android中它被称为微调,你可以看看这里的教程。

你好,微调

这是一个非常模糊的问题,你应该尝试更加描述你的问题。

这是一个在android中自定义combobox的例子:

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

希望能帮助到你!!

没有testing,但你可以得到越接近AutoCompleteTextView 。 您可以编写一个适配器,以忽略过滤function。 就像是:

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

…然后在你的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); 

代码没有被testing,可以有一些我没有考虑的过滤方法的function,但是你有它,用AutoCompleteTextView模拟ComboBox的基本原理。

编辑固定的NullFilter实现。 我们需要对项目进行访问,因此UnconditionalArrayAdapter的构造函数需要引用一个List(一种缓冲区)。 你也可以使用例如adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>); 然后使用adapter.add("Luxemburg") ,所以你不需要pipe理缓冲区列表。

这些问题是完全有效和清晰的,因为微调和combobox(阅读:微调,你也可以提供自定义值)是两个不同的东西。

我自己也在寻找同样的东西,对于给出的答案我并不满意。 所以我创造了我自己的东西 也许有些人会发现以下提示有用。 我没有提供完整的源代码,因为我在自己的项目中使用了一些传统调用。 无论如何,这应该是非常清楚的。

这是最后一件事的截图:

Android上的组合框

第一件事是创build一个视图,看起来和尚未扩展的微调框一样。 在截图中,在屏幕的顶部(焦点不清),您可以看到微调框和自定义视图在下面。 为此,我用style="?android:attr/spinnerStyle"使用了LinearLayout(实际上,我从Linear Layoutinheritance而来)。 LinearLayout包含带有style="?android:attr/spinnerItemStyle" TextView。 完整的XML片段将是:

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

正如我前面提到的,ComboBoxinheritance自LinearLayout。 它还实现了OnClickListener,它创build了一个具有从XML文件膨胀的自定义视图的对话框。 这是膨胀的观点:

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

还有两个需要实现的侦听器:onItemClick用于列表,onClick用于button。 这两个设置选定的值并closures对话框。

对于列表,你希望它看起来像扩展微调相同,你可以这样做,提供适当的(微调)风格的列表适配器,如下所示:

 ArrayAdapter<String> adapter = new ArrayAdapter<String>( activity, android.R.layout.simple_spinner_dropdown_item, states ); 

或多或less,应该是这样的。

自定义:)你可以使用下拉hori /垂直偏移属性当前位置的列表,也尝试android:spinnerMode =“对话”它更酷。

布局

  <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 /值/串

 <string-array name="myarray"> <item>value1</item> <item>value2</item> </string-array> 

那有用吗?

对于允许自由文本input并具有下拉列表框的combobox( http://en.wikipedia.org/wiki/Combo_box ),我使用了vbencebuild议的AutoCompleteTextView。

当用户select控件时,我使用onClickListener来显示下拉列表框。

我相信这最类似于这种combobox。

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