Как показать поле со списком в Android? [закрыто]

80

Как показать поле со списком в Android?

Джеймс
источник
1
Пожалуйста, объясните более четко, чего вы хотите. И то, что вы уже пробовали.
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 .
vbence
попробуйте этот пример stackoverflow.com/a/17650125/2027232
Николас Тайлер

Ответы:

76

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

Привет, Спиннер

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

ворчал
источник
17
Предлагаю вам рассмотреть это в контексте разработки под 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;

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

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

Раниз Ахмед
источник
1
Спасибо за ваш ответ. Я хочу использовать этот виджет, но хочу использовать в качестве источника данных массив String, а не курсор. Что я должен делать?
Али Бехзадиан Неджад
7

Не тестировалось, но, похоже, вы можете приблизиться к нему с помощью 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"), поэтому вам не нужно управлять списком буферов.

vbence
источник
Этот код не приближается к компиляции. Вызовы getFilter () выглядят как попытки бесконечного цикла, а publishResults возвращает значение из метода void. Идея в целом хорошая, но кто-то должен исправить этот пример.
dhakim
6

Вопросы совершенно правильные и ясные, поскольку 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
    );

Более или менее, так и должно быть.

Виктор Брешан
источник
Выглядит хорошо. Я пытаюсь реализовать ваше решение, но я новичок в разработке Android, и я немного не понимаю, где разместить фрагменты. Не могли бы вы немного пересмотреть, чтобы объяснить, как это реализовать?
You'reAGitForNotUsingGit 01
4

Сделано на заказ :) вы можете использовать выпадающие свойства горизонтального / вертикального смещения, чтобы расположить список в настоящее время, также попробуйте 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>

Это было полезно ??

ШАККИР
источник
как твой ответ? где нажать на AutoCompleteTextView и показать?
ZarNi Myo Sett Win
вы можете добавить дополнительные события в AutoCompleteTextView или счетчик по своему желанию.
ShAkKiR
0

Для поля со списком ( 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);
}
Rve
источник