Làm cách nào để hiển thị combobox trong Android?
Làm cách nào để hiển thị combobox trong Android?
Câu trả lời:
Trong android nó được gọi là Spinner bạn có thể xem qua hướng dẫn tại đây.
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.
Đâ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!!
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 UnconditionalArrayAdapter
cầ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.
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:
Đ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ó.
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 ??
Đố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 AutoCompleteTextView
theo 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);
}