Androidでコンボボックスを表示するにはどうすればよいですか?[閉まっている]


80

Androidでコンボボックスを表示するにはどうすればよいですか?


1
あなたが欲しいものをより明確に説明してください。そして、あなたがすでに試したこと。
fretje 2010年

30
@fretje質問はかなり具体的です。ComboBoxが何であるかを知っている場合は、説明は必要ありません。そうでない場合でも、グーグルで
検索

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

アンドロイドではスピナーと呼ばれ、ここでチュートリアルを見ることができます。

こんにちは、スピナー

そして、これは非常に漠然とした質問です。問題をより詳しく説明するようにしてください。


17
私はあなたがアンドロイド開発の文脈でこれを考慮することを提案します。Designerandroid.com/?p=8。android devのコンテキストでは、スピナーと呼ばれます。次回は調べてみてください。
2011年

3
はい。自分で提供したサイトを見ると、そのページのComboBoxに言及していることがわかりますが、APIにはSpinner(developer.android.com/resources/tutorials/views/…)への参照しかありません。)ここでは、「スピナーはアイテムを選択するためのドロップダウンリストに似たウィジェットです」と明確に述べています。これは他のJava実装と同様にComboBoxと呼ばれるべきであることに同意しますが、このコンテキストではそうではありません。
2011年

3
比喩がモバイルUIで少し変わることを理解しています。限られた画面領域をより有効に活用できる新しいウィジェット(コントロール)があります。これが、デスクトップメタファーでおなじみの一部のコントロールに新しい名前が使用されている理由だと思います。-スピナーがドロップダウンリストに似ていることに同意します。ただし、ListBox(ドロップダウンリスト)とComboBoxの主な違いは、コンボボックスは基本的に、リストから選択できるように拡張されたテキスト入力フィールドであるということです。リストから要素を選択するか、任意の値を入力することができます。
vbence

15
ニッチピッキングをやめて、Androidアプリを初めて作成したときに、コンボボックスやリストボックスのような動作をするコントロールを見つけるのに問題があったことを認めてください...
Torp 2011

11
私はまだコンボボックスを探しています。スピナーを見たことがあります。使用済みスピナー。しかし率直に言って、テキストを特定のオプション以外のものに設定する必要があるシナリオがあります。別名、入力できます。スピナーはコンボボックスではありませんが、通常は有効な代替手段です。
IAmGroot 2012年

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
お返事ありがとうございます。このウィジェットを使用したいのですが、カーソルではなくデータソースとして文字列の配列を使用したいと思います。私は何をすべきか?
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リスト(バッファーの一種)への参照を取得する必要があります。たとえばadapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);、を使用してadapter.add("Luxemburg")からを使用することもできるため、バッファリストを管理する必要はありません。


このコードはコンパイルに近づいていません。getFilter()の呼び出しは無限ループの試みのように見え、publishResultsはvoidメソッドから値を返しています。アイデアは全体的に良いですが、誰かがこの例を修正する必要があります。
dhakim 2014年

6

SpinnerとComboBox(カスタム値も提供できるSpinner)は2つの異なるものであるため、質問は完全に有効で明確です。

私は自分で同じことを探していましたが、与えられた答えに満足していませんでした。だから私は自分のものを作りました。おそらく、次のヒントが役立つと思う人もいるでしょう。自分のプロジェクトでいくつかのレガシー呼び出しを使用しているため、完全なソースコードを提供していません。とにかくそれはかなり明確なはずです。

これが最後のもののスクリーンショットです:

Android上のComboBox

最初に、まだ展開されていないスピナーと同じように見えるビューを作成しました。スクリーンショットでは、画面の上部(焦点が合っていない)にスピナーとそのすぐ下のカスタムビューが表示されます。そのために、LinearLayout(実際にはLinear Layoutから継承)をで使用しましたstyle="?android:attr/spinnerStyle"。LinearLayoutには、style="?android:attr/spinnerItemStyle"。を含むTextViewが含まれています。完全な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>

実装する必要のあるリスナーはさらに2つあります。リストの場合はonItemClick、ボタンの場合はonClickです。これらは両方とも、選択した値を設定し、ダイアログを閉じます。

リストの場合、展開されたSpinnerと同じように表示する必要があります。これを行うには、リストアダプターに次のような適切な(Spinner)スタイルを指定します。

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

多かれ少なかれ、それはそれであるはずです。


いいね。私はあなたのソリューションを実装しようとしていますが、私はAndroid開発に不慣れであり、スニペットをどこに置くかについて少し混乱しています。それを実装する方法を説明するために少し修正していただけませんか?
あなたはreAGitForNotUsingGit 2016年

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>

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

必要に応じて、AutoCompleteTextViewまたはスピナーにイベントを追加できます。
ShAkKiR 2018年

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.