以下范例将设计一个EditText,当User输入了新的文字,在单击"添加"按钮的同时,就会将输入的值添加Spinner(至下拉菜单的最后一项),接着Spinner会停留在刚添加好的选项上;当单击"删除"按钮,则删除选择的Spinner选项,常应用于未知Spinner选项数量的To-DoList或添加维护市县数据等。
我们来看看效果图
Spinner添加了OnItemSelectedListener事件,当单击下拉菜单后,将值带到上方的Text- View。上一个范例在new adapter时传入String数组,这次因为要添加及删除adapter,所以要传入的是ArrayList,否则,在添加删除时会出现错误。
Java代码:
/* import程序略 */
public class EX04_09 extends Activity {
private static final String[] countriesStr = {
"北京市", "上海市", "天津市", "重庆市"
};
private TextView myTextView;
private EditText myEditText;
private Button myButton_add;
private Button myButton_remove;
private Spinner mySpinner;
private ArrayAdapter<String> adapter;
private List<String> allCountries;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*加载main.xml Layout */
setContentView(R.layout.main);
allCountries = new ArrayList<String>();
for (int i = 0; i < countriesStr.length; i++) {
allCountries.add(countriesStr[i]);
}
/* new ArrayAdapter对象并将allCountries传入 */
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, allCountries); adapter .setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item);
/* 以findViewById()取得对象 */
myTextView = (TextView) findViewById(R.id.myTextView);
myEditText = (EditText) findViewById(R.id.myEditText);
myButton_add = (Button) findViewById(R.id.myButton_add);
myButton_remove = (Button) findViewById(R.id.myButton_remove);
mySpinner = (Spinner) findViewById(R.id.mySpinner);
/* 将ArrayAdapter添加Spinner对象中 */
mySpinner.setAdapter(adapter);
/* 将myButton_add添加OnClickListener */
myButton_add.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
String newCountry = myEditText.getText().toString();
/* 先比较添加的值是否已存在,不存在才可添加 */
for (int i = 0; i < adapter.getCount(); i++) {
if (newCountry.equals(adapter.getItem(i))) {
return;
}
}
if (!newCountry.equals("")) {
/* 将值添加到adapter */
adapter.add(newCountry);
/* 取得添加的值的位置 */
int position = adapter.getPosition(newCountry);
/* 将Spinner选择在添加的值的位置 */
mySpinner.setSelection(position);
/* 将myEditText清空 */
myEditText.setText("");
}
}
});
/* 将myButton_remove添加OnClickListener */
myButton_remove.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
if (mySpinner.getSelectedItem() != null) {
/* 删除mySpinner的值 */
adapter.remove(mySpinner.getSelectedItem().toString());
/* 将myEditText清空 */
myEditText.setText("");
if (adapter.getCount() == 0) {
/* 将myTextView清空 */
myTextView.setText("");
}
}
}
});
/* 将mySpinner添加OnItemSelectedListener */
mySpinner.setOnItemSelectedListener (new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
/* 将所选mySpinner的值带入myTextView中 */
myTextView.setText(arg0.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
}
setDropDownViewResource主要是设置User单击Spinner后出现的下拉菜单样式,除了前一个范例使用自设方式改变TextView内容之外,Android也提供两种基本的样式:
android.R.layout.simple_spinner_item:TextView的下拉菜单;
android.R.layout.simple_spinner_dropdown_item:除了有TextView,右边还有radio的下拉菜单。
查看Android 源代码中的simple_spinner_dropdown_item.xml,内容如下:
Java代码:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:singleLine="true" style="?android:attr/spinnerDropDownItemStyle" />
以下为自定义修改后,适用于spinner的Layout:
Java代码:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="12sp"
android:singleLine="true" style="?android:attr/spinnerDropDownItemStyle" android:textSize="10sp" />