sdk自带了很多的samples,学习一下里面的一个Spinner。

一开始不会怎么导入samples到eclipse中,有2个方法可以导入

file->new->other->Android->Android Sample Project或者Android Project From Existing Code

导入之后先运行看看效果(电脑配置不给力,模拟器启动不起,只能用真机)

 

选择了之后

这个程序在退出下次进的时候也可以保持住上次选中的选项,所以需要进行存储。

学到的知识点:

Spinner控件的基本使用+ArrayAdapter(数组适配器,设置Spinner的data)

  Spinner是神马ArrayAdapter肿么用

string.xml定义的数组在代码里如何获取

string.xml如何定义数组

SharedPreferences(轻量级的存储)的使用

android数据存储的4种方式

 

模仿samples的Spinner做一个写个程序

新建一个ChooseFaces的项目

string.xml

  1. <resources> 
  2.  
  3.     <string name="app_name">ChooseFaces</string> 
  4.     <string name="prompt">请选择表情</string> 
  5.     <string name="lastType">上次退出前选择的表情是:</string> 
  6.     <string name="labelPref">您选择的表情是:</string> 
  7.  
  8.     <string-array name="faceType"> 
  9.         <item>泡泡</item> 
  10.         <item>绿豆蛙</item> 
  11.         <item>兔斯基</item> 
  12.         <item>阿狸</item> 
  13.     </string-array> 
  14.  
  15. </resources> 

layout/main.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:background="#ffffff" 
  6.     android:orientation="vertical" > 
  7.  
  8.     <TextView 
  9.         android:id="@+id/tvpreTitle" 
  10.         android:layout_width="match_parent" 
  11.         android:layout_height="wrap_content" 
  12.         android:gravity="left" 
  13.         android:textColor="#CCCCCC" /> 
  14.  
  15.     <TextView 
  16.         android:id="@+id/tvTitle" 
  17.         android:layout_width="match_parent" 
  18.         android:layout_height="wrap_content" 
  19.         android:layout_marginBottom="20dp" 
  20.         android:layout_marginTop="20dp" 
  21.         android:gravity="left" /> 
  22.  
  23.     <Spinner 
  24.         android:id="@+id/spFaceType" 
  25.         android:layout_width="wrap_content" 
  26.         android:layout_height="wrap_content" 
  27.         android:layout_gravity="left" 
  28.         android:prompt="@string/prompt" /> 
  29.  
  30.     <LinearLayout 
  31.         android:layout_width="match_parent" 
  32.         android:layout_height="match_parent" 
  33.         android:gravity="center" > 
  34.  
  35.         <ImageView 
  36.             android:id="@+id/ivDisplay" 
  37.             android:layout_width="wrap_content" 
  38.             android:layout_height="wrap_content" 
  39.             android:layout_gravity="center" /> 
  40.     </LinearLayout> 
  41.  
  42. </LinearLayout> 

MainActivity.java

  1. package com.dq.choosefaces; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.content.SharedPreferences; 
  6. import android.content.res.Resources; 
  7. import android.os.Bundle; 
  8. import android.view.View; 
  9. import android.widget.AdapterView; 
  10. import android.widget.AdapterView.OnItemSelectedListener; 
  11. import android.widget.ArrayAdapter; 
  12. import android.widget.ImageView; 
  13. import android.widget.Spinner; 
  14. import android.widget.TextView; 
  15.  
  16. public class MainActivity extends Activity { 
  17.  
  18.     // 下拉单默认选中的位置 
  19.     private final static int DEFAULT_POSITION = 0
  20.     // 轻量存储的文件名 
  21.     private final static String PREFERENCES_FILE = "facePrefs"
  22.     // 下拉单位置在存储文件中的键名 
  23.     private final static String POSITION_KEY = "position"
  24.     private final static String SELECT_TEXT_KEY = "selectText"
  25.  
  26.     // 下拉单选中的位置 
  27.     private int position; 
  28.     // 下拉单选中的文本 
  29.     private String selectText = null
  30.     // 文本显示的前缀 
  31.     private String labelPrefix = null
  32.     // 上次退出前选择的表情 
  33.     private String lastTypePrefix = null
  34.     // 一个文本控件 
  35.     private TextView tvPre = null
  36.     private TextView tv = null
  37.     // 一个数组适配器,为Spinner提供数据,SpinnerAdapter的子类 
  38.     private ArrayAdapter<CharSequence> adapter = null
  39.     // 一个下拉单控件 
  40.     private Spinner sp = null
  41.     // 一个图片控件 
  42.     private ImageView iv = null
  43.  
  44.     @Override 
  45.     protected void onCreate(Bundle savedInstanceState) { 
  46.         super.onCreate(savedInstanceState); 
  47.         setContentView(R.layout.main); 
  48.  
  49.         // 获取控件 
  50.         this.tvPre = (TextView) findViewById(R.id.tvpreTitle); 
  51.         this.tv = (TextView) findViewById(R.id.tvTitle); 
  52.         this.sp = (Spinner) findViewById(R.id.spFaceType); 
  53.         this.iv = (ImageView) findViewById(R.id.ivDisplay); 
  54.  
  55.         // 获取资源 
  56.         Resources res = getResources(); 
  57.  
  58.         // 获取文本显示的前缀 
  59.         this.labelPrefix = res.getString(R.string.labelPref); 
  60.         this.lastTypePrefix = res.getString(R.string.lastType); 
  61.  
  62.         // 获取数组数据 
  63.         String[] data = res.getStringArray(R.array.faceType); 
  64.  
  65.         /* 
  66.          * ArrayAdapter静态方法获得一个ArrayAdapter实例 
  67.          * (当前Activity,数组资源ID,下拉单一个item的layout资源ID) 第三参数表示spinner没有展开前的UI类型 
  68.          * 选择了android提供的样式,和当前程序的R不同,这是android.R.layout下的资源 
  69.          * 也可以自己new一个,data表示数据的数组 this.adapter = new 
  70.          * ArrayAdapter<CharSequence>(this,android.R.layout.test_list_item, 
  71.          * data); 
  72.          * 如果在layout里设置了spinner的属性 android:entries="@array/faceType" 
  73.          * 那么就不需要在代码里spinner.setAdapter()了,自动设置好了 
  74.          */ 
  75.         this.adapter = ArrayAdapter.createFromResource(this, R.array.faceType, 
  76.                 android.R.layout.test_list_item); 
  77.  
  78.         // 设置spinner展开时的UI类型,如果不设置就默认是spinner不展开时的UI类型 
  79.         this.adapter 
  80.                 .setDropDownViewResource(android.R.layout.simple_list_item_single_choice); 
  81.  
  82.         // 设置spinner的适配器 
  83.         this.sp.setAdapter(this.adapter); 
  84.  
  85.         // 添加spinner item被选择事件 
  86.         this.sp.setOnItemSelectedListener(new MyItemSelectedListener()); 
  87.  
  88.         // 读取数据 
  89.         readPrefsState(this); 
  90.  
  91.         // 设置上一次退出时的表情 
  92.         this.tvPre.setText(this.lastTypePrefix + this.selectText); 
  93.  
  94.         // 设置下拉单选中的位置 
  95.         this.sp.setSelection(this.position); 
  96.  
  97.     } 
  98.  
  99.     private class MyItemSelectedListener implements OnItemSelectedListener { 
  100.  
  101.         // 重写此方法 
  102.         @Override 
  103.         public void onItemSelected(AdapterView<?> parent, View view, 
  104.                 int position, long id) { 
  105.  
  106.             // 设置当前选择的item位置 
  107.             MainActivity.this.position = position; 
  108.  
  109.             // 设置当前选择的item文本 
  110.             MainActivity.this.selectText = parent.getItemAtPosition(position) 
  111.                     .toString(); 
  112.             MainActivity.this.tv.setText(labelPrefix + selectText); 
  113.  
  114.             int imgId = 0
  115.             switch (position) { 
  116.             case 0
  117.                 imgId = R.raw.pp; 
  118.                 break
  119.             case 1
  120.                 imgId = R.raw.ldw; 
  121.                 break
  122.             case 2
  123.                 imgId = R.raw.tsj; 
  124.                 break
  125.             case 3
  126.                 imgId = R.raw.al; 
  127.                 break
  128.             } 
  129.  
  130.             // 设置图片 
  131.             MainActivity.this.iv.setImageResource(imgId); 
  132.         } 
  133.  
  134.         @Override 
  135.         public void onNothingSelected(AdapterView<?> parent) { 
  136.         } 
  137.  
  138.     } 
  139.  
  140.     public boolean readPrefsState(Context c) { 
  141.  
  142.         /* 
  143.          * 当前Activity方法获得一个SharedPreferences实例 第一个参数是文件名 第二个参数是设置文件的访问权限,有3个选择 
  144.          * 1、MODE_PRIVATE(只有调用的程序可以访问) 2、MODE_WORLD_READABLE(别的程序有读的权限) 
  145.          * 3、MODE_WORLD_WRITEABLE(别的程序有写的权限) 但是在API17里2,3被弃用了,it is dangerous 
  146.          */ 
  147.         SharedPreferences spref = c.getSharedPreferences(PREFERENCES_FILE, 
  148.                 MODE_PRIVATE); 
  149.         // 读取到POSITION_KEY和SELECT_TEXT_KEY的值,如果不存在此key,则默认为DEFAULT_POSITION 
  150.         this.position = spref.getInt(POSITION_KEY, DEFAULT_POSITION); 
  151.         this.selectText = spref.getString(SELECT_TEXT_KEY, ""); 
  152.  
  153.         // 包含此key则返回true,反之false 
  154.         return (spref.contains(POSITION_KEY)); 
  155.  
  156.     } 
  157.  
  158.     public boolean writePrefsState(Context c) { 
  159.  
  160.         /* 
  161.          * 当前Activity方法获得一个SharedPreferences实例 第一个参数是文件名 第二个参数是设置文件的访问权限,有3个选择 
  162.          * 1、MODE_PRIVATE(只有调用的程序可以访问) 2、MODE_WORLD_READABLE(别的程序有读的权限) 
  163.          * 3、MODE_WORLD_WRITEABLE(别的程序有写的权限) 
  164.          */ 
  165.         SharedPreferences spref = c.getSharedPreferences(PREFERENCES_FILE, 
  166.                 MODE_PRIVATE); 
  167.  
  168.         /* 
  169.          * 获取SharedPreferences.Editor对象,SharedPreferences本来只可以读取数据, 
  170.          * 如果要编辑就要获取Editor对象 
  171.          */ 
  172.         SharedPreferences.Editor edit = spref.edit(); 
  173.  
  174.         // 存储这2个值 
  175.         edit.putInt(POSITION_KEY, this.position); 
  176.         edit.putString(SELECT_TEXT_KEY, this.selectText); 
  177.  
  178.         // 使用edit.commit()提交,这样才会真正存储到文件中,true表示成功,false表示失败 
  179.         return (edit.commit()); 
  180.     } 
  181.  
  182.     @Override 
  183.     protected void onStop() { 
  184.  
  185.         // 此Activity停止的时候存储数据 
  186.         writePrefsState(this); 
  187.  
  188.         super.onStop(); 
  189.     } 
  190.  

存放图片的目录raw,一开始可能不存在,需要自己新建一个,然后去百度贴吧拷几张表情来。

关于SharedPreferences操作的文件存储在哪里,可以打开DDMS->File Explorer

展开到/data/data/<package name>/shared_prefs下

我是用真机测试不知道为何打不开这个目录,可能是没有权限访问的原因,但是我试了在模拟器是可以看到的。

然后就运行一下。

Spinner选择的对话框

然后关掉程序再打开

阳台还是挺凉快的