Як я можу показати комбобокс в Android? [зачинено]


80

Як я можу показати комбобокс в Android?


1
Будь ласка, поясніть чіткіше, що ви хочете. І те, що ви вже спробували.
fretje

30
@fretje Питання досить конкретне. Якщо ви знаєте, що таке ComboBox , вам не потрібно пояснення. Якщо ви цього не зробите, ви все одно можете
загуглити

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 dev його називають Spinner. Будь ласка, проведіть дослідження наступного разу.
бурчав

3
Так, і заглянувши на сайт, який ви самі надали, ви можете побачити, що вони справді згадують ComboBox на цій сторінці, але в API є лише посилання на Spinner ( developer.android.com/resources/tutorials/views/… ) Тут вони чітко вказують, що "Spinner - це віджет, подібний до випадаючого списку для вибору елементів". Я погоджуюсь з вами, що ЦЕ МОЖЕ називатися ComboBox, як і в інших реалізаціях Java, але в цьому контексті це не так.
бурчав

3
Я розумію, що метафора трохи змінює з мобільними інтерфейсами. З'явилися нові віджети (елементи керування), які можуть краще використовувати обмежений екран. Я думаю, саме тому використані нові імена для деяких елементів управління, які знайомі утворюють метафору на робочому столі. - Я згоден, що Спінер подібний до випадаючого списку. Однак головна різниця між ListBox (випадаючий список) і ComboBox полягає в тому, що поле зі списком - це в основному поле введення тексту, розширене з можливістю вибору зі списку. Ви можете вибрати елемент зі списку або ввести довільні значення.
vbence

15
Зупиніть задиристість і визнайте, що всі мали проблеми з пошуком елемента керування, який виглядає як комбіноване вікно або поле зі списком, коли вони вперше писали додаток для Android ...
Торп,

11
Я все ще шукаю комбіновану коробку .. Ive побачив 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
Дякую за відповідь. Я хочу використовувати цей віджет, але хочу використовувати масив рядка як джерело даних, а не як курсор. що я повинен зробити?
Алі Бехзадіян Неджад

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потреб повинен взяти посилання на Список (вид буфера). Ви також можете використовувати eg, adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);а потім використовувати adapter.add("Luxemburg"), тому вам не потрібно керувати списком буферів.


Цей код не наближається до компіляції. Виклики getFilter () виглядають як спроби нескінченного циклу, і objavдітиРезультати повертає значення з методу 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, і я трохи заплутаний, куди слід помістити фрагменти. Не могли б ви трохи переглянути, щоб пояснити, як це реалізувати?
YouAGitForNotUsingGit

4

На замовлення :) Ви можете використовувати випадаючі властивості 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 / values ​​/ string

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

Це було корисно ??


як ваша відповідь? де клацнути на AutoCompleteTextView і показати?
ZarNi Myo Sett Виграв

Ви можете додати додаткові події до AutoCompleteTextView або вертушки, як забажаєте.
ShAkKiR

0

Для комбінованого вікна ( http://en.wikipedia.org/wiki/Combo_box ), який дозволяє вільне введення тексту та має розкривний список, я використав a, 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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.