Пожалуйста, объясните более четко, чего вы хотите. И то, что вы уже пробовали.
fretje
30
@fretje Вопрос довольно конкретный. Если вы знаете, что такое ComboBox , вам не нужно объяснять. Если вы этого не сделаете, вы все равно можете погуглить: en.wikipedia.org/wiki/Combo_box
vbence,
1
@vbence: Я не говорил о ComboBox. Поскольку Android - это операционная система, вы также можете спросить «Как показать поле со списком в Windows», который вообще не является конкретным.
fretje
18
@fretje Для Windows это было бы недостаточно конкретным по очевидным причинам (вы можете использовать C # или Delphi и т. д.), но на Android вы говорите о единой среде разработки. Когда вы говорите об Android, это так же конкретно, как и о Visual Basic .Net .
Предлагаю вам рассмотреть это в контексте разработки под Android. designerandroid.com/?p=8 . В контексте разработки для Android он называется Spinner. Пожалуйста, сделайте свое исследование в следующий раз.
проворчал
3
Да, и посмотрев на сайт, который вы предоставили сами, вы можете увидеть, что они упоминают ComboBox на этой странице, но в API есть только ссылка на Spinner ( developer.android.com/resources/tutorials/views/… ) Здесь четко указано, что «Spinner - это виджет, похожий на раскрывающийся список для выбора элементов». Я согласен с вами, что это ДОЛЖНО называться ComboBox, как и другие реализации Java, но в данном контексте это не так.
проворчал
3
Я понимаю, что метафора немного меняется с мобильным интерфейсом. Появились новые виджеты (элементы управления), которые могут лучше использовать ограниченное пространство экрана. Думаю, именно поэтому для некоторых элементов управления использованы новые имена, знакомые по метафоре рабочего стола. - Я согласен, что Spinner похож на раскрывающийся список. Однако основное различие между ListBox (раскрывающийся список) и ComboBox заключается в том, что поле со списком в основном представляет собой текстовое поле ввода, расширенное с возможностью выбора из списка. Вы можете выбрать элемент из списка или ввести произвольные значения.
vbence
15
Прекратите придираться и признайте, что у всех были проблемы с поиском элемента управления, который действует как поле со списком или список, когда они впервые написали приложение для Android ...
Торп
11
Я все еще ищу поле со списком .. Я видел Spinners. Б / у блесны. Но, честно говоря, у меня есть сценарий, в котором мне нужно установить текст на что-то другое, кроме данной опции. Также они могут это ввести. Спиннеры - это не поля со списком, но они обычно являются допустимой альтернативой.
IAmGroot
11
Вот пример настраиваемого поля со списком в 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);
}
}
Спасибо за ваш ответ. Я хочу использовать этот виджет, но хочу использовать в качестве источника данных массив String, а не курсор. Что я должен делать?
Али Бехзадиан Неджад
7
Не тестировалось, но, похоже, вы можете приблизиться к нему с помощью AutoCompleteTextView . Вы можете написать адаптер, который игнорирует функции фильтра. Что-то вроде:
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();
}
}
}
}
Код не протестирован, могут быть некоторые функции с методом фильтрации, который я не рассматривал, но вот он, основные принципы эмуляции ComboBox с AutoCompleteTextView.
Изменить
реализацию фиксированного NullFilter. Нам нужен доступ к элементам, поэтому конструктору UnconditionalArrayAdapterнеобходимо взять ссылку на список (своего рода буфер). Вы также можете использовать, например, adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);а затем использовать adapter.add("Luxemburg"), поэтому вам не нужно управлять списком буферов.
Этот код не приближается к компиляции. Вызовы getFilter () выглядят как попытки бесконечного цикла, а publishResults возвращает значение из метода void. Идея в целом хорошая, но кто-то должен исправить этот пример.
dhakim
6
Вопросы совершенно правильные и ясные, поскольку Spinner и ComboBox (прочтите: Spinner, где вы также можете указать собственное значение) - это две разные вещи.
Я сам искал то же самое и не удовлетворился полученными ответами. Так что я создал свою собственную вещь. Возможно, кому-то пригодятся следующие подсказки. Я не предоставляю полный исходный код, так как использую некоторые устаревшие вызовы в своем собственном проекте. В любом случае это должно быть довольно ясно.
Вот скриншот последнего:
Первым делом нужно было создать представление, которое будет выглядеть так же, как счетчик, который еще не был расширен. На скриншоте в верхней части экрана (не в фокусе) вы можете увидеть счетчик и настраиваемый вид справа под ним. Для этой цели я использовал LinearLayout (фактически, я унаследовал от Linear Layout) с style="?android:attr/spinnerStyle". LinearLayout содержит TextView с расширением style="?android:attr/spinnerItemStyle". Полный фрагмент XML будет:
Как я уже упоминал ранее, ComboBox наследуется от LinearLayout. Он также реализует OnClickListener, который создает диалоговое окно с настраиваемым представлением, созданным из файла XML. Вот раздутый вид:
Вам необходимо реализовать еще два слушателя: onItemClick для списка и onClick для кнопки. Оба они устанавливают выбранное значение и закрывают диалог.
Для списка вы хотите, чтобы он выглядел так же, как расширенный Spinner, вы можете сделать это, предоставив адаптеру списка соответствующий стиль (Spinner) следующим образом:
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(
activity,
android.R.layout.simple_spinner_dropdown_item,
states
);
Выглядит хорошо. Я пытаюсь реализовать ваше решение, но я новичок в разработке Android, и я немного не понимаю, где разместить фрагменты. Не могли бы вы немного пересмотреть, чтобы объяснить, как это реализовать?
You'reAGitForNotUsingGit 01
4
Сделано на заказ :) вы можете использовать выпадающие свойства горизонтального / вертикального смещения, чтобы расположить список в настоящее время, также попробуйте android: spinnerMode = "dialog", это круче.
как твой ответ? где нажать на AutoCompleteTextView и показать?
ZarNi Myo Sett Win
вы можете добавить дополнительные события в AutoCompleteTextView или счетчик по своему желанию.
ShAkKiR
0
Для поля со списком ( http://en.wikipedia.org/wiki/Combo_box ), которое позволяет вводить произвольный текст и имеет раскрывающийся список, я использовалAutoCompleteTextView как было предложено vbence.
Я использовал onClickListener для отображения раскрывающегося списка, когда пользователь выбирает элемент управления.
Я считаю, что это больше всего напоминает такой комбинированный список.
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);
}
Ответы:
В Android это называется Spinner, вы можете посмотреть руководство здесь.
Привет, Спиннер
И это очень расплывчатый вопрос, вы должны попытаться описать вашу проблему более подробно.
источник
Вот пример настраиваемого поля со списком в 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, где вы также можете указать собственное значение) - это две разные вещи.
Я сам искал то же самое и не удовлетворился полученными ответами. Так что я создал свою собственную вещь. Возможно, кому-то пригодятся следующие подсказки. Я не предоставляю полный исходный код, так как использую некоторые устаревшие вызовы в своем собственном проекте. В любом случае это должно быть довольно ясно.
Вот скриншот последнего:
Первым делом нужно было создать представление, которое будет выглядеть так же, как счетчик, который еще не был расширен. На скриншоте в верхней части экрана (не в фокусе) вы можете увидеть счетчик и настраиваемый вид справа под ним. Для этой цели я использовал 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 );
Более или менее, так и должно быть.
источник
Сделано на заказ :) вы можете использовать выпадающие свойства горизонтального / вертикального смещения, чтобы расположить список в настоящее время, также попробуйте 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>
Это было полезно ??
источник
Для поля со списком ( http://en.wikipedia.org/wiki/Combo_box ), которое позволяет вводить произвольный текст и имеет раскрывающийся список, я использовал
AutoCompleteTextView
как было предложено vbence.Я использовал
onClickListener
для отображения раскрывающегося списка, когда пользователь выбирает элемент управления.Я считаю, что это больше всего напоминает такой комбинированный список.
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); }
источник