Làm cách nào để hiển thị combobox trong Android? [đóng cửa]


80

Làm cách nào để hiển thị combobox trong Android?


1
Vui lòng giải thích rõ hơn những gì bạn muốn. Và những gì bạn đã thử.
fretje

30
@fretje Câu hỏi khá cụ thể. Nếu bạn biết ComboBox là gì, bạn không cần giải thích. Nếu không, bạn vẫn có thể google nó: en.wikipedia.org/wiki/Combo_box
vbence

1
@vbence: Tôi không nói về ComboBox. Vì Android là một hệ điều hành, bạn cũng có thể hỏi "Cách hiển thị hộp kết hợp trong Windows", điều này không cụ thể chút nào.
fretje

18
@fretje Đối với Windows, nó sẽ không đủ cụ thể vì những lý do rõ ràng (bạn có thể sử dụng C # hoặc Delphi, v.v.), nhưng trên Android, bạn đang nói về một khung phát triển duy nhất. Khi bạn nói về Android, nó cũng cụ thể như khi nói Visual Basic .Net .
vbence

Câu trả lời:


76

Trong android nó được gọi là Spinner bạn có thể xem qua hướng dẫn tại đây.

Xin chào, Spinner

Và đây là một câu hỏi rất mơ hồ, bạn nên cố gắng mô tả kỹ hơn vấn đề của mình.


17
Tôi khuyên bạn nên xem xét điều này trong bối cảnh phát triển của Android. Designerandroid.com/?p=8 . Trong bối cảnh của android dev, nó được gọi là Spinner. Vui lòng thực hiện nghiên cứu của bạn trong thời gian tới.
càu nhàu vào

3
Có và bằng cách xem xét trang web bạn đã cung cấp, bạn có thể thấy rằng họ đề cập đến ComboBox trên trang đó nhưng trong API chỉ có tham chiếu đến Spinner ( developer.android.com/resources/tutorials/views/… ) Ở đây họ nói rõ rằng "Spinner là một widget tương tự như một danh sách thả xuống để chọn các mục". Tôi đồng ý với bạn rằng nó NÊN được gọi là ComboBox như với các triển khai Java khác nhưng trong bối cảnh này thì không.
càu nhàu

3
Tôi hiểu rằng phương thức ẩn thay đổi một chút đối với giao diện người dùng di động. Có các widget (điều khiển) mới có thể sử dụng tốt hơn vùng màn hình hạn chế. Tôi đoán đó là lý do tại sao các tên mới được sử dụng cho một số điều khiển quen thuộc tạo thành ẩn dụ trên máy tính để bàn. - Tôi đồng ý rằng Spinner tương tự như danh sách thả xuống. Tuy nhiên, sự khác biệt chính giữa ListBox (danh sách thả xuống) và ComboBox là hộp tổ hợp về cơ bản là một trường nhập văn bản được mở rộng với khả năng chọn từ danh sách. Bạn có thể chọn một phần tử tạo thành danh sách hoặc bạn có thể nhập các giá trị tùy ý.
vbence

15
Dừng soi mói và thừa nhận rằng tất cả mọi người đã có vấn đề tìm kiếm một điều khiển mà loại hành vi giống như một combo box hoặc danh sách hộp lần đầu tiên họ đã viết một ứng dụng Android ...
Torp

11
Tôi vẫn đang tìm kiếm một hộp kết hợp .. Tôi đã thấy Spinners. Máy quay đã qua sử dụng. Nhưng thành thật mà nói, tôi có một tình huống mà tôi cần đặt văn bản thành một cái gì đó khác với một tùy chọn nhất định. Aka họ có thể gõ vào đó. Con quay không phải là hộp kết hợp, nhưng chúng thường là một sự thay thế hợp lệ.
IAmGroot

11

Đây là một ví dụ về combobox tùy chỉnh trong 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);
   }
}

Hy vọng nó giúp!!


1
Cảm ơn bạn đã trả lời của bạn. Tôi muốn sử dụng tiện ích này nhưng tôi muốn sử dụng một mảng Chuỗi làm nguồn dữ liệu chứ không phải con trỏ. tôi nên làm gì?
Ali Behzadian Nejad 14/09/13

7

Chưa được thử nghiệm, nhưng dường như bạn có thể đến gần hơn với AutoCompleteTextView . Bạn có thể viết một bộ điều hợp mà bỏ qua các chức năng của bộ lọc. Cái gì đó như:

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

... thì trong onCreate của bạn:

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

Mã không được kiểm tra, có thể có một số tính năng với phương pháp lọc mà tôi không xem xét, nhưng bạn có nó, các nguyên tắc cơ bản để mô phỏng một ComboBox với một AutoCompleteTextView.

Chỉnh sửa triển khai NullFilter đã sửa . Chúng ta cần quyền truy cập vào các mục, do đó, hàm tạo của các mục UnconditionalArrayAdaptercần tham chiếu đến một Danh sách (loại bộ đệm). Bạn cũng có thể sử dụng ví dụ adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);và sau đó sử dụng adapter.add("Luxemburg"), vì vậy bạn không cần quản lý danh sách bộ đệm.


Mã này không gần biên dịch. Các lệnh gọi đến getFilter () trông giống như các nỗ lực với một vòng lặp vô hạn và công bố đang trả về một giá trị từ một phương thức void. Ý tưởng tổng thể là tốt, nhưng ai đó nên sửa ví dụ này.
dhakim

6

Các câu hỏi hoàn toàn hợp lệ và rõ ràng vì Spinner và ComboBox (đọc nó: Spinner nơi bạn cũng có thể cung cấp giá trị tùy chỉnh) là hai thứ khác nhau.

Bản thân tôi cũng đang tìm kiếm điều tương tự và tôi không hài lòng với những câu trả lời đã cho. Vì vậy, tôi đã tạo ra thứ của riêng mình. Có lẽ một số sẽ thấy những gợi ý sau đây hữu ích. Tôi không cung cấp mã nguồn đầy đủ vì tôi đang sử dụng một số lệnh gọi kế thừa trong dự án của riêng mình. Dù sao thì nó cũng khá rõ ràng.

Đây là ảnh chụp màn hình của điều cuối cùng:

ComboBox trên Android

Điều đầu tiên là tạo một chế độ xem trông giống như con quay vẫn chưa được mở rộng. Trong ảnh chụp màn hình, ở đầu màn hình (ngoài tiêu điểm), bạn có thể thấy con quay và chế độ xem tùy chỉnh bên phải bên dưới nó. Với mục đích đó, tôi đã sử dụng LinearLayout (thực ra, tôi kế thừa từ Linear Layout) với style="?android:attr/spinnerStyle". LinearLayout chứa TextView với style="?android:attr/spinnerItemStyle". Đoạn mã XML hoàn chỉnh sẽ là:

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

Như, tôi đã đề cập trước đó ComboBox kế thừa từ LinearLayout. Nó cũng triển khai OnClickListener để tạo hộp thoại với chế độ xem tùy chỉnh được thổi phồng từ tệp XML. Đây là chế độ xem tăng cao:

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

Có hai trình nghe nữa mà bạn cần triển khai: onItemClick cho danh sách và onClick cho nút. Cả hai điều này đều đặt giá trị đã chọn và loại bỏ hộp thoại.

Đối với danh sách, bạn muốn nó trông giống như Spinner mở rộng, bạn có thể làm điều đó bằng cách cung cấp bộ điều hợp danh sách với kiểu (Spinner) thích hợp như sau:

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

Ít nhiều, đó là nó.


Có vẻ tốt. Tôi đang cố gắng triển khai giải pháp của bạn, nhưng tôi là người mới phát triển Android và tôi hơi bối rối về vị trí đặt các đoạn mã. Bạn có vui lòng sửa đổi một chút để giải thích cách triển khai nó không?
You'reAGitForNotUsingGit

4

Tùy chỉnh được thực hiện :) bạn có thể sử dụng thuộc tính hori / vertical offset thả xuống để định vị danh sách hiện tại, cũng có thể thử android: spinnerMode = "hộp thoại" nó hay hơn.

Bố trí

  <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 / giá trị / chuỗi

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

Điều đó có hữu ích không ??


câu trả lời của bạn như thế nào? nơi nhấp vào AutoCompleteTextView và hiển thị?
ZarNi Myo Sett giành chiến thắng vào

bạn có thể thêm các sự kiện bổ sung vào AutoCompleteTextView hoặc spinner như bạn muốn.
ShAkKiR

0

Đối với hộp kết hợp ( http://en.wikipedia.org/wiki/Combo_box ) cho phép nhập văn bản miễn phí và có hộp danh sách thả xuống, tôi đã sử dụng AutoCompleteTextViewtheo gợi ý của vbence.

Tôi đã sử dụng onClickListenerđể hiển thị hộp danh sách thả xuống khi người dùng chọn điều khiển.

Tôi tin rằng điều này giống với loại hộp kết hợp này nhất.

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.