Androidでコンボボックスを表示するにはどうすればよいですか?
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);
}
}
それが役に立てば幸い!!
テストされていませんが、取得できる距離は 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をエミュレートする基本原則があります。
EditNullFilterの実装を修正しました。アイテムにアクセスする必要があるため、UnconditionalArrayAdapter
のコンストラクターはList(バッファーの種類)への参照を取得する必要があります。また、使用することができますadapter = new UnconditionalArrayAdapter<String>(..., new ArrayList<String>);
を使用してからadapter.add("Luxemburg")
を使用するため、バッファリストを管理する必要はありません。
質問は完全に有効で明確です。SpinnerとComboBox(それを読んでください:カスタム値を提供できるSpinner)は2つの異なるものです。
私は自分で同じものを探していましたが、与えられた答えに満足していませんでした。だから私は自分のものを作成しました。おそらく、次のヒントが役立つと思う人もいるでしょう。私は自分のプロジェクトでいくつかのレガシーコールを使用しているため、完全なソースコードを提供していません。とにかくかなりはっきりしているはずです。
最後のスクリーンショットは次のとおりです。
最初のことは、まだ展開されていないスピナーと同じように見えるビューを作成することでした。スクリーンショットの(焦点が合っていない)画面の上部には、スピナーとその下のカスタムビューが表示されます。そのために、style="?android:attr/spinnerStyle"
とともにLinearLayoutを使用しました(実際には、Linear Layoutから継承しました)。 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: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>
それは役に立ちましたか?
コンボボックス( http://en.wikipedia.org/wiki/Combo_box )で、フリーテキスト入力が可能で、ドロップダウンリストボックスがある場合、vbenceが提案するAutoCompleteTextView
を使用しました。
ユーザーがコントロールを選択したときに、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);
}