Android에서 콤보 박스를 표시하려면 어떻게해야합니까? [닫은]


80

Android에서 콤보 박스를 표시하려면 어떻게해야합니까?


1
원하는 것을 더 명확하게 설명하십시오. 그리고 당신이 이미 시도한 것.
fretje 2010-06-11

30
@fretje 질문은 매우 구체적입니다. ComboBox 가 무엇인지 안다면 설명이 필요하지 않습니다. 그렇지 않은 경우 여전히 Google을 검색 할 수 있습니다. en.wikipedia.org/wiki/Combo_box
vbence

1
@vbence : ComboBox에 대해 얘기 한 것이 아닙니다. Android는 OS이므로 "Windows에서 콤보 박스를 표시하는 방법"을 물어볼 수 있습니다. 이는 전혀 구체적이지 않습니다.
fretje

18
@fretje Windows의 경우 명백한 이유 (C # 또는 Delphi 등을 할 수 있음)로 인해 충분히 구체적이지 않지만 Android에서는 단일 개발 프레임 워크에 대해 이야기하고 있습니다. Android 에 대해 이야기 할 때는 Visual Basic .Net 을 말하는 것만 큼 구체적 입니다.
vbence

이 예제를 시도해보세요. stackoverflow.com/a/17650125/2027232
Nicolas Tyler

답변:


76

Android에서는 Spinner라고하며 여기에서 튜토리얼을 볼 수 있습니다.

안녕, 스피너

그리고 이것은 매우 모호한 질문입니다. 문제를 좀 더 설명해야합니다.


17
나는 이것을 안드로이드 개발의 맥락에서 고려할 것을 제안합니다. designerandroid.com/?p=8 . android dev의 맥락에서 Spinner라고합니다. 다음에 조사해주세요.
불평

3
예. 직접 제공 한 사이트를 살펴보면 해당 페이지의 ComboBox에 대한 언급이 있지만 API에는 Spinner에 대한 참조 만 있음을 알 수 있습니다 ( developer.android.com/resources/tutorials/views/… ) 여기에서 "Spinner는 항목 선택을위한 드롭 다운 목록과 유사한 위젯"이라고 명확하게 설명합니다. 나는 이것이 다른 Java 구현과 마찬가지로 ComboBox라고 불려야한다는 것에 동의하지만이 맥락에서는 그렇지 않습니다.
2011 년

3
은유가 모바일 UI에서 약간 변경된다는 것을 이해합니다. 제한된 화면 공간을 더 잘 사용할 수있는 새로운 위젯 (컨트롤)이 있습니다. 이것이 데스크탑 메타포에서 친숙한 일부 컨트롤에 대해 새 이름을 사용하는 이유입니다. -Spinner가 드롭 다운 목록과 유사하다는 데 동의합니다. 그러나 ListBox (드롭 다운 목록)와 ComboBox 의 주요 차이점 은 콤보 상자가 기본적으로 목록에서 선택할 수있는 확장 된 텍스트 입력 필드라는 것입니다. 목록에서 요소를 선택하거나 임의의 값을 입력 할 수 있습니다.
vbence

15
정지 하찮은 일에 속 태우고 그 모두가 문제 콤보 상자 나 목록과 같은 행위의 종류가 안드로이드 응용 프로그램을 작성 처음 상자에있는 컨트롤을 발견했다 ... 인정

11
아직 콤보 박스를 찾고 있어요. 스피너를 봤어요. 사용 된 스피너. 그러나 솔직히 텍스트를 주어진 옵션이 아닌 다른 것으로 설정해야하는 시나리오가 있습니다. 일명 그들은 그것을 입력 할 수 있습니다. 스피너는 콤보 상자가 아니지만 일반적으로 유효한 대안입니다.
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 배열을 사용하고 싶습니다. 어떻게해야합니까?
Ali Behzadian Nejad 2013

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

코드는 테스트되지 않았고, 내가 고려하지 않은 필터링 방법을 사용하는 몇 가지 기능이있을 수 있지만 AutoCompleteTextView로 ComboBox를 에뮬레이트하는 기본 원칙이 있습니다.

고정 NullFilter 구현을 편집 합니다. 항목에 대한 액세스가 필요하므로 생성자 UnconditionalArrayAdapter는 List (일종의 버퍼)에 대한 참조를 가져와야합니다. eg adapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);를 사용한 다음을 사용할 수도 adapter.add("Luxemburg")있으므로 버퍼 목록을 관리 할 필요가 없습니다.


이 코드는 컴파일에 가깝지 않습니다. getFilter () 호출은 무한 루프 시도처럼 보이며 publishResults는 void 메서드에서 값을 반환합니다. 아이디어는 전반적으로 좋지만 누군가이 예제를 수정해야합니다.
dhakim

6

Spinner와 ComboBox (사용자 지정 값을 제공 할 수있는 Spinner)는 서로 다른 두 가지 항목이므로 질문은 완벽하게 유효하고 명확합니다.

나도 똑같은 것을 찾고 있었는데 주어진 답변에 만족하지 못했습니다. 그래서 나는 나만의 것을 만들었다. 아마도 다음과 같은 힌트가 유용 할 것입니다. 내 프로젝트에서 일부 레거시 호출을 사용하고 있으므로 전체 소스 코드를 제공하지 않습니다. 어쨌든 꽤 명확해야합니다.

다음은 마지막 스크린 샷입니다.

Android의 ComboBox

첫 번째는 아직 확장되지 않은 스피너와 동일하게 보이는 뷰를 만드는 것이 었습니다. 스크린 샷에서 화면 상단 (초점 없음)에서 스피너와 그 오른쪽 아래에있는 사용자 정의보기를 볼 수 있습니다. 이를 위해 나는 LinearLayout (실제로는 Linear Layout에서 상 속됨)을 style="?android:attr/spinnerStyle". LinearLayout에는 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에서 상속됩니다. 또한 XML 파일에서 확장 된 사용자 정의보기가있는 대화 상자를 생성하는 OnClickListener를 구현합니다. 다음은 부풀린보기입니다.

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

4

맞춤 제작 :) 드롭 다운 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();
            }
        });

res / 값 / 문자열

<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 )의 경우 AutoCompleteTextViewvbence가 제안한대로 사용했습니다 .

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.