Как показать combobox в Android?

Как показать combobox в Android?

Solutions Collecting From Web of "Как показать combobox в Android?"

В android это называется Spinner, вы можете посмотреть здесь учебник.

Привет, Spinner

И это очень неопределенный вопрос, вы должны попытаться описать свою проблему более подробно.

Вот пример пользовательского combobox в 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); } } 

Надеюсь, поможет!!

Не проверено, но чем ближе вы можете получить, тем лучше, с помощью AutoCompleteTextView . Вы можете написать адаптер, который игнорирует функции фильтра. Что-то вроде:

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

Код не проверен, могут быть некоторые функции с методом фильтрации, которые я не рассматривал, но там у вас есть основные принципы эмуляции ComboBox с помощью AutoCompleteTextView.

Измените фиксированную реализацию NullFilter. Нам нужен доступ к элементам, поэтому конструктор UnconditionalArrayAdapter должен ссылаться на список (вид буфера). Вы также можете использовать, например, adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>); А затем используйте adapter.add("Luxemburg") , поэтому вам не нужно управлять списком буферов.

Вопросы совершенно правильны и понятны с тех пор, как Spinner и ComboBox (читайте: Spinner, где вы можете предоставить собственное значение) – это две разные вещи.

Я сам искал то же самое, и я не был удовлетворен данными ответами. Поэтому я создал свою собственную вещь. Возможно, некоторые из них найдут полезные советы. Я не предоставляю полный исходный код, поскольку я использую некоторые унаследованные вызовы в своем собственном проекте. В любом случае, это должно быть довольно ясно.

Вот скриншот последнего:

ComboBox на Android

Первым делом было создать представление, которое будет выглядеть так же, как и счетчик, который еще не был расширен. На скриншоте в верхней части экрана (вне фокуса) вы можете увидеть прядильщик и пользовательский вид справа. Для этого я использовал LinearLayout (фактически, я унаследовал от Linear Layout) со style="?android:attr/spinnerStyle" . LinearLayout содержит TextView со style="?android:attr/spinnerItemStyle" . Полный фрагмент 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> 

Как я уже говорил ранее, ComboBox наследуется от LinearLayout. Он также реализует OnClickListener, который создает диалог с настраиваемым представлением, раздутым из файла 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 для кнопки. Оба они устанавливают выбранное значение и отклоняют диалог.

Для этого списка вы хотите, чтобы он выглядел так же, как расширенный Spinner, вы можете сделать это, предоставив адаптер списка с соответствующим стилем (Spinner) следующим образом:

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

Более того, это должно быть.

Для combobox ( http://en.wikipedia.org/wiki/Combo_box ), который позволяет бесплатно вводить текст и имеет раскрывающийся список, я использовал AutoCompleteTextView как это было предложено vbence.

Я использовал 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); } 

На заказ: вы можете использовать свойства dropdown hori / vertical offset для размещения списка в настоящее время, а также попробовать android: spinnerMode = «dialog» – это более круто.

раскладка

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

Было ли это полезно?