Spinner的用法(转)
一、以資源方式,靜態展示 Spinner 選項
1.在資源文件 (strings.xml) 中,增加:
<stringname="spin_prompt">請選擇城市</string><string-arrayname="cities"><item>北京</item><item>上海</item><item>南京</item><item>烏魯木齊</item><item>哈爾濱</item><item>符拉迪沃斯托克</item></string-array>2.在布局文件 (main.xml) 中,增加:
<Spinner android:id="@+id/Spinner01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:entries="@array/cities"android:prompt="@string/spin_prompt"/>注意: android:prompt 必須要引用 strings.xml 中資源 ID ,而不能在這里直接用 raw text 。
運行結果:
?
點擊Spinner右邊的帶倒三角的按鈕,即出現各城市選項如下:
二、以代碼方式,動態展示 Spinner 選項
1.在資源文件 strings.xml 中,無需定義任何資源。
2.在布局文件 (main.xml) 中, Spinner 的描述為:
<Spinner android:id="@+id/Spinner01"android:layout_width="wrap_content"android:layout_height="wrap_content"/>3.在 Activity 對應的代碼中做相關修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private static final String tag = "ControlSpinner"; 4 private static final String[] cities = {"上海", "北京", "南京", "哈爾濱", "烏魯木齊", "符拉迪沃斯托克", "圣弗朗西斯科"}; 5 6 private Spinner spinner ; 7 @Override 8 public void onCreate(Bundle savedInstanceState) 9 { 10 super .onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 13 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cities); 14 15 //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 16 //adapter.add("上海"); 17 //adapter.add("北京"); 18 //adapter.add("南京"); 19 //adapter.add("哈爾濱"); 20 //adapter.add("烏魯木齊"); 21 //adapter.add("符拉迪沃斯托克"); 22 //adapter.add("圣弗朗西斯科"); 23 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 24 25 spinner = (Spinner) this.findViewById(R.id.Spinner01); 26 spinner.setAdapter(adapter); 27 spinner.setPrompt("請選擇城市:"); 28 } 29 }運行效果和 用法一 相同。
注意:
1.被注釋的代碼可以代替
private static final String[] cities = {"上海", "北京", "南京", "哈爾濱", "烏魯木齊", "符拉迪沃斯托克", "圣弗朗西斯科"};ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cities);兩條語句的組合。
2.ArrayAdapter 構造函數中的第二個參數是 android.R.layout. simple_spinner_item , adapter.setDropDownViewResource 中的參數則是 android.R.layout. simple_spinner_dropdown_item 。它們是不一樣的。
自定義下拉菜單里的樣式,其關鍵在于調用setDropDownViewResource方法,以XML的方式定義下拉菜單要顯示的模樣.
三、混合方式
1.在資源文件 (strings.xml) 中,相關的資源描述為:
2.在布局文件 (main.xml) 中, Spinner 的描述為:
< Spinnerandroid:id = "@+id/Spinner01"android:layout_width = "wrap_content"android:layout_height = "wrap_content"/>3.在 Activity 對應的代碼中做相關修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner ; 4 @Override 5 public void onCreate(Bundle savedInstanceState) 6 { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource (this, R.array.cities, android.R.layout.simple_spinner_item); 11 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 12 13 spinner = (Spinner) this.findViewById(R.id.Spinner01); 14 spinner.setAdapter(adapter); 15 spinner.setPrompt("請選擇城市:"); 16 } 17 18 }運行效果與 用法一 一樣。
注意:
1.ArrayAdapter<CharSequence> adapter 中的模板參數必須為 CharSequence
2.createFromResource 的第二個參數 R.array.cities 就是在 strings.xml 中定義的資源
四、改變 Spinner 對象本身的大小,及其文字的大小和顏色
1.在布局文件 (main.xml) 中,修改 Spinner 對象的描述如下:
?
<Spinnerandroid:id="@+id/Spinner01"android:layout_width="160px"android:layout_height="40px"/>這使得 Spinner01 的寬度為 160 個像素,高度為 40 個像素。
2.創建一個布局文件 spinnerLayout.xml ,使之如下:
<?xmlversion="1.0"encoding="utf-8"?> <TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="12sp"android:textColor="#FF8B1500"android:gravity="center"/>3.在 Activity 對應的代碼中做相關修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner; 4 @Override 5 public void onCreate(Bundle savedInstanceState) 6 { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource (this, R.array.cities, R.layout. spinnerlayout); 11 //改為 spinnerlayout 12 13 adapter.setDropDownViewResource(R.layout.spinnerlayout); 14 // 改為 spinnerlayout 15 16 spinner = (Spinner) this.findViewById(R.id.Spinner01); 17 spinner.setAdapter(adapter); 18 spinner.setPrompt("請選擇城市:"); 19 } 20 }運行結果如下:
五、同時顯示圖片和文本
假定有澳大利亞、瑞士、中華人民共和國和美利堅合眾國這4個國家,我們想把它們的國旗和它們的國名同時顯示在Spinner中。
它們對應的國旗圖片資源分別如下:
對應的圖片文件名分別為: au.png, ch.png, cn.png 和 us.png 。
1.首先把國旗圖片拖入 res/drawable-mdpi 文件夾。系統會自動為我們在 R.java 中生成相應的 id 。情形如下:
public static final class drawable {public static final int au=0x7f020000;public static final int ch=0x7f020001;public static final int cn=0x7f020002;public static final int icon=0x7f020004; // 系統自帶的 icon 圖標public static final int us=0x7f020005; }
2.在 strings.xml 中給出各個國家的國名。
<stringname="au">澳大利亞</string> <stringname="ch">瑞士</string> <stringname="cn">中華人民共和國</string> <stringname="us">美利堅合眾國</string>保存后,系統也會自動為我們在 R.java 中生成相應的 id 。情形如下:
public static final class string {public static final int app_name=0x7f040001; // 系統自帶的 stringpublic static final int au=0x7f040002;public static final int ch=0x7f040003;public static final int cn=0x7f040004;public static final int us=0x7f040006; }3.假定在布局文件 (main.xml) 中, Spinner01 的屬性如下:
<Spinnerandroid:id="@+id/Spinner01"android:layout_width="300px"android:layout_height="48px"/>4.在 Activity 對應的代碼中做相關修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner ; 4 // 國旗圖片 ID 數組 5 private int [] drawableIDs = {R.drawable.au, R.drawable.ch, R.drawable.cn, R.drawable.us}; 6 7 // 國名文字 ID 數組 8 private int [] nameIDs = {R.string.au, R.string.ch, R.string.cn, R.string.us}; 9 10 // 自定義一個 Adapter ,要重寫 getCount 、 getItem 、 getItemId 和 getView 方法。其中的 getView 方法最為重要。 11 12 // 當然也可以先獨立定義一個 Adapter 類 13 private BaseAdapter customizedAdapter = new BaseAdapter() 14 { 15 public int getCount() 16 { 17 // TODO Auto-generated method stub 18 return drawableIDs.length ; 19 } 20 21 public Object getItem(int position) 22 { 23 // TODO Auto-generated method stub 24 return drawableIDs[position]; 25 } 26 27 public long getItemId(int position) 28 { 29 // TODO Auto-generated method stub 30 return position; 31 } 32 33 public View getView(int position, View convertView, ViewGroup parent) 34 { 35 // TODO Auto-generated method stub 36 // 先設定一個 LinearLayout 對象 ll 37 LinearLayout ll = new LinearLayout(ControlSpinner.this); 38 39 // 使 ll 的 Orientation 為 HORIZONTAL 40 ll.setOrientation(LinearLayout.HORIZONTAL); 41 42 // 在垂直方向居中 43 ll.setGravity(Gravity.CENTER_VERTICAL); 44 45 // 創建一個 ImageView 對象 46 ImageView iv = new ImageView(ControlSpinner.this); 47 48 // 指定對應 position 的 Image 49 iv.setImageResource(drawableIDs[position]); 50 51 // 設定 ImageView 對象 iv 的寬度為 100 像素,高度為 40 像素 52 53 iv.setLayoutParams(new ViewGroup.LayoutParams(100, 40)); 54 55 // 將 iv 加入到 ll 56 ll.addView(iv); 57 58 // 創建一個 TextView 對象 59 TextView tv = new TextView(ControlSpinner.this); 60 61 // 指定對應 position 的 Text 62 tv.setText(nameIDs[position]); 63 // 設定文字大小 64 tv.setTextSize(14); 65 // 設定文字顏色 66 tv.setTextColor(Color.BLUE); 67 // 將 tv 加入到 ll 68 ll.addView(tv); 69 70 return ll; 71 } 72 }; 73 74 @Override 75 public void onCreate(Bundle savedInstanceState) 76 { 77 super.onCreate(savedInstanceState); 78 setContentView(R.layout.main); 79 80 spinner = (Spinner) this.findViewById(R.id.Spinner01); 81 spinner.setAdapter(customizedAdapter); 82 spinner.setPrompt("請選擇國家:"); 83 } 84 }運行結果如下:
如果獨立建一個 CustomizedAdapter ,相關代碼改寫如下:
1 class CustomizedAdapter extends BaseAdapter 2 { 3 private Context ctx; 4 private int drawableIDs[]; 5 private int stringIDs[]; 6 public CustomizedAdapter(Context ctx, int DrawableIDs[], int StringIDs[]) 7 { 8 this.ctx = ctx; 9 this.drawableIDs = DrawableIDs; 10 this.stringIDs = StringIDs; 11 } 12 13 public int getCount() 14 { 15 // TODO Auto-generated method stub 16 return drawableIDs.length; 17 } 18 19 public Object getItem(int position) 20 { 21 // TODO Auto-generated method stub 22 return drawableIDs[position]; 23 } 24 25 public long getItemId(int position) 26 { 27 // TODO Auto-generated method stub 28 return position; 29 } 30 31 public View getView(int position, View convertView, ViewGroup parent) 32 { 33 // TODO Auto-generated method stub 34 LinearLayout ll = new LinearLayout(ctx); 35 ll.setOrientation(LinearLayout.HORIZONTAL); 36 ll.setGravity(Gravity.CENTER_VERTICAL); 37 38 ImageView iv = new ImageView(ctx); 39 iv.setImageResource(drawableIDs[position]); 40 iv.setLayoutParams(new ViewGroup.LayoutParams(100, 40)); 41 42 ll.addView(iv); 43 44 TextView tv = new TextView(ctx); 45 tv.setText(stringIDs[position]); 46 tv.setTextSize(14); 47 tv.setTextColor(Color.BLUE); 48 ll.addView(tv); 49 50 return ll; 51 } 52 } View CodeActivity 對應的代碼改寫如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner; 4 private int[] drawableIDs = {R.drawable.au, R.drawable.ch, R.drawable.cn, R.drawable.us}; 5 private int[] nameIDs = {R.string.au, R.string.ch, R.string.cn, R.string.us}; 6 7 @Override 8 public void onCreate(Bundle savedInstanceState) 9 { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 13 CustomizedAdapter customizedAdapter = new CustomizedAdapter(this, drawableIDs, nameIDs); 14 15 spinner = (Spinner) this.findViewById(R.id.Spinner01); 16 spinner.setAdapter(customizedAdapter); 17 spinner.setPrompt("請選擇國家:"); 18 } 19 } View Code? 所得到的效果,和前面的情況是一樣的。
六、獲取所選項目的文本內容
1.正常情況下 ( 用法一~ 用法四所示的情形 ) ,我們可以通過這樣的方式,來獲取 Spinner 對象中所選項目的文本內容:
TextView tx_spinner = (TextView) spinner.getSelectedView(); String str = (String)tx_spinner.getText(); Toast.makeText (this, str, Toast.LENGTH_LONG).show();2.但是如果我們使用用法 5 中自定義的 Adapter ,就需要做一些稍微的改變,才能正常得到 Spinner 所選項目的文字內容。因為, CustomizedAdapter 中的 getView 方法,最后返回的是一個 LinearLayout 對象 (LinearLayout 繼承了 View) ,而在 LinearLayout 對象中,又包含了一個 ImageView 和一個 TextView 。所以,?TextView tx_spinner = (TextView)spinner .getSelectedView();?這句話就不再使用了。因為 spinner.getSelectView() 會返回一個包含了一個 ImageView 和一個 TextView 的 LinearLayout 對象,而不再是一個單純的 TextView 了。
為此,我們在布局文件 main.xml 中,增加一個 Button ,因為我們想在點擊一個按鈕的情況下,獲取 Spinner 中所選中的文字內容。如下:
<Buttonandroid:id="@+id/Button01"android:layout_width="120px"android:layout_height="60px"android:text="OK"/>用法五中的 CustomizedAdapter 中的 getView 方法要增加一行代碼 ( 粗體字 ) ,修改后如下
1 public View getView(int position, View convertView, ViewGroup parent) 2 { 3 // TODO Auto-generated method stub 4 LinearLayout ll = new LinearLayout(ctx); 5 ll.setOrientation(LinearLayout.HORIZONTAL); 6 ll.setGravity(Gravity.CENTER_VERTICAL); 7 8 ImageView iv = new ImageView(ctx); 9 iv.setImageResource(drawableIDs[position]); 10 iv.setLayoutParams(new ViewGroup.LayoutParams(100, 40)); 11 ll.addView(iv); 12 13 TextView tv = new TextView(ctx); 14 tv.setText(stringIDs[position]); 15 tv.setTextSize(14); 16 tv.setTextColor(Color.BLUE); 17 tv.setTag("tagTextView"); 18 // 為 TextView 對象增加一個Tag ,以便在后續的處理中,可以通過 19 20 ll.addView(tv); 21 // findViewWithTag 方法來獲取這個 TextView 對象 22 return ll; 23 } View Code修改 Activity 所對應的代碼,使之如下:
1 public class ControlSpinner extends Activity implements OnClickListener 2 { 3 private Spinner spinner ; 4 5 6 @Override 7 public void onCreate(Bundle savedInstanceState) 8 { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.main); 11 12 CustomizedAdapter customizedAdapter = new CustomizedAdapter(this, drawableIDs, nameIDs); 13 14 spinner = (Spinner) this.findViewById(R.id.Spinner01); 15 spinner.setAdapter(customizedAdapter); 16 spinner.setPrompt("請選擇國家:"); 17 18 // 獲取按鈕對象并為之增加監聽器 : 19 Button button = (Button) this.findViewById(R.id.Button01); 20 21 button.setOnClickListener(this); 22 } 23 24 public void onClick(View v) 25 { 26 // TODO Auto-generated method stub 27 if (v.getId() == R.id.Button01 ) 28 { 29 // 方法 1~ 方法 4 的情形,可以使用如下被注釋的的代碼: 30 // TextView tx_spinner = (TextView)spinner.getSelectedView(); 31 // String str = (String) tx_spinner.getText(); 32 // Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 33 34 // 方法 5 所列的情形,需用如下方式獲得 Spinner 所選中項目的文字內容 35 LinearLayout ll = (LinearLayout)spinner.getSelectedView(); 36 37 TextView tv = (TextView)ll.findViewWithTag("tagTextView"); 38 // 得到相應的 TextView 對象 39 40 String str = (String)tv.getText(); 41 Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 42 } 43 } 44 } View Code其他代碼和用法 5 中的代碼一致。運行結果:
可見可以正確地獲得Spinner所選項目中的文字內容。
七、在 onItemSelected 方法中,獲取所選項目的文本內容。
1.首先讓 Activity 實現 OnItemSelectedListener 接口
2.給 spinner 對象增加 OnItemSelectedListener
3.實現 OnItemSelectedListener 接口中定義的兩個接口方法 onItemSelected 和 onNothingSelected?代碼如下:
1 public class ControlSpinner extends Activity implements OnClickListener, OnItemSelectedListener 2 { 3 private Spinner spinner ; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) 7 { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.main); 10 11 CustomizedAdapter customizedAdapter = new CustomizedAdapter(this, drawableIDs, nameIDs); 12 13 spinner = (Spinner) this .findViewById(R.id.Spinner01); 14 spinner.setAdapter(customizedAdapter); 15 spinner.setPrompt("請選擇國家:"); 16 17 // 獲取按鈕對象并為之設定 listener : 18 Button button = (Button) this.findViewById(R.id.Button01); 19 20 button.setOnClickListener(this); 21 22 // 為 spinner 設定 listener : 23 spinner.setOnItemSelectedListener(this); 24 } 25 26 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 27 { 28 // 以下代碼,適用于用法 1~4 中的情形 29 // if(parent.getId() == R.id.Spinner01) 30 // { 31 // Toast.makeText(this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); 32 // tv.getText(); 33 34 // } 35 36 if (parent.getId() == R.id.Spinner01) 37 { 38 LinearLayout ll = (LinearLayout)view; 39 TextView tv = (TextView)ll.findViewWithTag("tagTextView"); 40 String str = (String)tv.getText(); 41 Toast.makeText(this, str, Toast.LENGTH_LONG ).show(); 42 } 43 } 44 45 public void onNothingSelected(AdapterView<?> parent) 46 { 47 48 } 49 50 } View Code其他代碼與用法 6 同。
//其中, onItemSelected 方法解釋如下: public abstract void onItemSelected (AdapterView <?> parent, View view, int position, long id)Callback method to be invoked when an item in this view has been selected. Impelmenters can call getItemAtPosition(position) if they need to access the data associated with the selected item.Parameters parent The AdapterView where the selection happened view The view within the AdapterView that was clicked position The position of the view in the adapter id The row id of the item that is selected轉載于:https://www.cnblogs.com/myxiaoQ/articles/3682198.html
總結
以上是生活随笔為你收集整理的Spinner的用法(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年大学计算机二级考试报名,南通职
- 下一篇: C++中单独大括号的意义