范例说明 前面的范例对Spinner的自定义菜单、交互事件已大致掌握了设计方法,但在Android的Spinner里的元素,若要动态增减Spinner下拉菜单的选项,就必须利用ArrayList的依赖性来完成。 以下范例将设计一个EditText,当User输入了新的文字,在单击“添加”按钮的同时,就会将输入的值添加Spinner(至下拉菜单的最后一项),接着Spinner会停留在刚添加好的选项上;当单击“删除”按钮,则删除选择的Spinner选项,常应用于未知Spinner选项数量的To-Do List或添加维护市县数据等。 <!--[endif]--> ▲ 图4-9 随User的输入文字,可动态添加/删除的Spinner菜单 范例程序 src/irdc.ex04_09/EX04_09.java Spinner添加了OnItemSelectedListener事件,当单击下拉菜单后,将值带到上方的Text- View。上一个范例在new adapter时传入String数组,这次因为要添加及删除adapter,所以要传入的是ArrayList,否则,在添加删除时会出现错误。 /* 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,内容如下: <?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: <?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" /> |