sdk自带了不少的samples,学习一下里面的一个Spinner。html
一开始不会怎么导入samples到eclipse中,有2个方法能够导入java
file->new->other->Android->Android Sample Project或者Android Project From Existing Codeandroid
导入以后先运行看看效果(电脑配置不给力,模拟器启动不起,只能用真机)数组
选择了以后app
这个程序在退出下次进的时候也能够保持住上次选中的选项,因此须要进行存储。eclipse
学到的知识点:ide
Spinner控件的基本使用+ArrayAdapter(数组适配器,设置Spinner的data)学习
string.xml定义的数组在代码里如何获取ui
SharedPreferences(轻量级的存储)的使用
模仿samples的Spinner作一个写个程序
新建一个ChooseFaces的项目
string.xml
- <resources>
- <string name="app_name">ChooseFaces</string>
- <string name="prompt">请选择表情</string>
- <string name="lastType">上次退出前选择的表情是:</string>
- <string name="labelPref">您选择的表情是:</string>
- <string-array name="faceType">
- <item>泡泡</item>
- <item>绿豆蛙</item>
- <item>兔斯基</item>
- <item>阿狸</item>
- </string-array>
- </resources>
layout/main.xml
- <?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="match_parent"
- android:background="#ffffff"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tvpreTitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="left"
- android:textColor="#CCCCCC" />
- <TextView
- android:id="@+id/tvTitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="20dp"
- android:layout_marginTop="20dp"
- android:gravity="left" />
- <Spinner
- android:id="@+id/spFaceType"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="left"
- android:prompt="@string/prompt" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center" >
- <ImageView
- android:id="@+id/ivDisplay"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center" />
- </LinearLayout>
- </LinearLayout>
MainActivity.java
- package com.dq.choosefaces;
- import android.app.Activity;
- import android.content.Context;
- import android.content.SharedPreferences;
- import android.content.res.Resources;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemSelectedListener;
- import android.widget.ArrayAdapter;
- import android.widget.ImageView;
- import android.widget.Spinner;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- // 下拉单默认选中的位置
- private final static int DEFAULT_POSITION = 0;
- // 轻量存储的文件名
- private final static String PREFERENCES_FILE = "facePrefs";
- // 下拉单位置在存储文件中的键名
- private final static String POSITION_KEY = "position";
- private final static String SELECT_TEXT_KEY = "selectText";
- // 下拉单选中的位置
- private int position;
- // 下拉单选中的文本
- private String selectText = null;
- // 文本显示的前缀
- private String labelPrefix = null;
- // 上次退出前选择的表情
- private String lastTypePrefix = null;
- // 一个文本控件
- private TextView tvPre = null;
- private TextView tv = null;
- // 一个数组适配器,为Spinner提供数据,SpinnerAdapter的子类
- private ArrayAdapter<CharSequence> adapter = null;
- // 一个下拉单控件
- private Spinner sp = null;
- // 一个图片控件
- private ImageView iv = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 获取控件
- this.tvPre = (TextView) findViewById(R.id.tvpreTitle);
- this.tv = (TextView) findViewById(R.id.tvTitle);
- this.sp = (Spinner) findViewById(R.id.spFaceType);
- this.iv = (ImageView) findViewById(R.id.ivDisplay);
- // 获取资源
- Resources res = getResources();
- // 获取文本显示的前缀
- this.labelPrefix = res.getString(R.string.labelPref);
- this.lastTypePrefix = res.getString(R.string.lastType);
- // 获取数组数据
- String[] data = res.getStringArray(R.array.faceType);
- /*
- * ArrayAdapter静态方法得到一个ArrayAdapter实例
- * (当前Activity,数组资源ID,下拉单一个item的layout资源ID) 第三参数表示spinner没有展开前的UI类型
- * 选择了android提供的样式,和当前程序的R不一样,这是android.R.layout下的资源
- * 也能够本身new一个,data表示数据的数组 this.adapter = new
- * ArrayAdapter<CharSequence>(this,android.R.layout.test_list_item,
- * data);
- * 若是在layout里设置了spinner的属性 android:entries="@array/faceType"
- * 那么就不须要在代码里spinner.setAdapter()了,自动设置好了
- */
- this.adapter = ArrayAdapter.createFromResource(this, R.array.faceType,
- android.R.layout.test_list_item);
- // 设置spinner展开时的UI类型,若是不设置就默认是spinner不展开时的UI类型
- this.adapter
- .setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
- // 设置spinner的适配器
- this.sp.setAdapter(this.adapter);
- // 添加spinner item被选择事件
- this.sp.setOnItemSelectedListener(new MyItemSelectedListener());
- // 读取数据
- readPrefsState(this);
- // 设置上一次退出时的表情
- this.tvPre.setText(this.lastTypePrefix + this.selectText);
- // 设置下拉单选中的位置
- this.sp.setSelection(this.position);
- }
- private class MyItemSelectedListener implements OnItemSelectedListener {
- // 重写此方法
- @Override
- public void onItemSelected(AdapterView<?> parent, View view,
- int position, long id) {
- // 设置当前选择的item位置
- MainActivity.this.position = position;
- // 设置当前选择的item文本
- MainActivity.this.selectText = parent.getItemAtPosition(position)
- .toString();
- MainActivity.this.tv.setText(labelPrefix + selectText);
- int imgId = 0;
- switch (position) {
- case 0:
- imgId = R.raw.pp;
- break;
- case 1:
- imgId = R.raw.ldw;
- break;
- case 2:
- imgId = R.raw.tsj;
- break;
- case 3:
- imgId = R.raw.al;
- break;
- }
- // 设置图片
- MainActivity.this.iv.setImageResource(imgId);
- }
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- }
- public boolean readPrefsState(Context c) {
- /*
- * 当前Activity方法得到一个SharedPreferences实例 第一个参数是文件名 第二个参数是设置文件的访问权限,有3个选择
- * 一、MODE_PRIVATE(只有调用的程序能够访问) 二、MODE_WORLD_READABLE(别的程序有读的权限)
- * 三、MODE_WORLD_WRITEABLE(别的程序有写的权限) 可是在API17里2,3被弃用了,it is dangerous
- */
- SharedPreferences spref = c.getSharedPreferences(PREFERENCES_FILE,
- MODE_PRIVATE);
- // 读取到POSITION_KEY和SELECT_TEXT_KEY的值,若是不存在此key,则默认为DEFAULT_POSITION
- this.position = spref.getInt(POSITION_KEY, DEFAULT_POSITION);
- this.selectText = spref.getString(SELECT_TEXT_KEY, "");
- // 包含此key则返回true,反之false
- return (spref.contains(POSITION_KEY));
- }
- public boolean writePrefsState(Context c) {
- /*
- * 当前Activity方法得到一个SharedPreferences实例 第一个参数是文件名 第二个参数是设置文件的访问权限,有3个选择
- * 一、MODE_PRIVATE(只有调用的程序能够访问) 二、MODE_WORLD_READABLE(别的程序有读的权限)
- * 三、MODE_WORLD_WRITEABLE(别的程序有写的权限)
- */
- SharedPreferences spref = c.getSharedPreferences(PREFERENCES_FILE,
- MODE_PRIVATE);
- /*
- * 获取SharedPreferences.Editor对象,SharedPreferences原本只能够读取数据,
- * 若是要编辑就要获取Editor对象
- */
- SharedPreferences.Editor edit = spref.edit();
- // 存储这2个值
- edit.putInt(POSITION_KEY, this.position);
- edit.putString(SELECT_TEXT_KEY, this.selectText);
- // 使用edit.commit()提交,这样才会真正存储到文件中,true表示成功,false表示失败
- return (edit.commit());
- }
- @Override
- protected void onStop() {
- // 此Activity中止的时候存储数据
- writePrefsState(this);
- super.onStop();
- }
- }
存放图片的目录raw,一开始可能不存在,须要本身新建一个,而后去百度贴吧拷几张表情来。
关于SharedPreferences操做的文件存储在哪里,能够打开DDMS->File Explorer
展开到/data/data/<package name>/shared_prefs下
我是用真机测试不知道为什么打不开这个目录,多是没有权限访问的缘由,可是我试了在模拟器是能够看到的。
而后就运行一下。
Spinner选择的对话框
而后关掉程序再打开