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選擇的對話框
而後關掉程序再打開