2012年12月12日 星期三

(Android Note) 畫面横屏OR值屏

1. code
  •  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//畫面直向
  • setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//畫面橫向
以上畫面只要轉方向時,activity 會重新執行。

  • 如果不要 activity 重新執行,需要在 AndroidManifest.xml 檔案中,在 activity 加入 android:configChanges="orientation|keyboardHidden" 就會禁止重新執行。

2012年11月22日 星期四

(Android Note) webview 字體設定

1. code

(1) 卷軸設定 


WebView.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY); 
WebView.setHorizontalScrollBarEnabled(false); //橫軸
WebView.setVerticalScrollBarEnabled(false); //縱軸

(2)字體 

WebView.getSettings().setDefaultFontSize(value); //value 數值

 OR

WebView.getSettings().setTextSize(WebSettings.TextSize.Normal); //TextSize只有5種設定方式(Smallest、Smaller、Normal、Larger、Largest)

2012年11月15日 星期四

(Android Note) 圖片依照螢幕節析度自動調整

1. Introduction

(1) 有時用bitmap會發覺內存溢出導致error,主要是圖片太大才會發生此情況,以下code  可以解內存溢出問題。
(2)目前android mobile device太多不同的節析度,此code 為了讓圖片可以依照節析度自行縮放。

2. Code

changePictureWH(讀取圖檔, 元件);//getResources().openRawResource(R.drawable.X), 元件


public void changePictureWH(InputStream resources, ImageButton id) { 
     Bitmap bmp;
     BitmapFactory.Options bfo = new BitmapFactory.Options();
    bfo.inJustDecodeBounds = true; //不分配空間
    bmp = BitmapFactory.decodeStream(resources,null,bfo);
    int picWidth  = bfo.outWidth;  //圖片寬度
    int picHeight = bfo.outHeight; //圖片長度
    int screenWidth = Define_Variable.scalWidth; //螢幕寬度  
    int screenHeight = Define_Variable.scalHeight;  //螢幕長度
    bfo.inSampleSize = 1;  //isSampleSize 指圖片縮放程度 = 100/isSampleSize, 值越大圖越小 
    //根據螢幕的大小和圖片大小計算比例
    if(picWidth > picHeight){  
    if(picWidth > screenWidth)  bfo.inSampleSize = picWidth/screenWidth;  
    }else{  
    if(picHeight > screenHeight)  bfo.inSampleSize = picHeight/screenHeight;  
    }  
   //產生經過縮放有像素的bitmap
    bfo.inJustDecodeBounds = false;  //從新分配空間
    bmp = BitmapFactory.decodeStream(resources,null,bfo); 
    id.setImageBitmap(bmp);
    }

(Android Note) 自動觸發事件

1. code

view.performClick(); //view定義的元件, performClick()自動觸發click事件

2012年10月31日 星期三

(Android Note) listview 移置最後一行

1. Code


listview.postDelayed(new Runnable() {
    @Override
    public void run() {
    listview.setSelection(data.size()); //設定移到第幾個item
    }
}, 0);

2012年10月25日 星期四

(Android Note) Timer 使用方法


1. Code

(1) schedule 用法
schedule(TimerTask task, long delay) // 只執行一次,long delay 延遲時間(單位毫秒)
schedule(TimerTask task, long delay, long period) //重複執行 ,long period 週期多久執行(單位毫秒)

(2)
public class TimerState extends Activity{
Timer mTimer;
public int num;
@Override
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.timerstate);
       num  = 0;
       mTimer = new Timer();
       mTimer.schedule( new startTimer() , 0, 1000 ); //第二個參數 0 代表無延遲時間, 第三個參數 單位毫秒
       //mTimer.cancel();//暫停
}

//使用schedule方法,必須要有物件繼承imerTask,方可使用
public class startTimer extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
num++;
Log.e("num", ""+num);
}
}
}

(Android Note) EditText 編輯觸發事件

1. Code 


public class EditTextEvent extends Activity{
EditText eteET; 
@Override
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.edittextevent);
       
       eteET = (EditText)findViewById(R.id.eteET);
       eteET.addTextChangedListener(eteETListener); //監聽改變文字事件
}

public TextWatcher eteETListener = new TextWatcher(){

@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
Toast.makeText(EditTextEvent.this, "afterTextChanged--"+arg0.toString(), Toast.LENGTH_SHORT).show();//顯示修改後字串內容
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
Toast.makeText(EditTextEvent.this, "beforeTextChanged--"+arg0.toString(), Toast.LENGTH_SHORT).show();//顯示修改前字串內容
}

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
Toast.makeText(EditTextEvent.this, "onTextChanged0--"+arg0.toString(), Toast.LENGTH_SHORT).show();//顯示修改後字串內容
Toast.makeText(EditTextEvent.this, "onTextChanged1--"+arg1, Toast.LENGTH_SHORT).show();//顯示目前第幾個位置,從0開始
Toast.makeText(EditTextEvent.this, "onTextChanged2--"+arg2, Toast.LENGTH_SHORT).show();//none
Toast.makeText(EditTextEvent.this, "onTextChanged3--"+arg3, Toast.LENGTH_SHORT).show();//none
}
 
};
}

(Android Note) 取得手機語系

1. Code

(1) Locale.getDefault().getLanguage()
==>return en, zh ....等

(2) Locale.getDefault().getDisplayLanguage()
==>return English, 中文....等

2012年10月19日 星期五

(Android Note) 編譯時,出現Conversion to Dalvik format failed: Unable to execute dex: null

1. 說明

        常發生編譯時,出現 Conversion to Dalvik format failed: Unable to execute dex: null 訊息,主要是因為加入 JAR 檔時,以 Add External JARs....  加入;後來搜尋資料,發現以 Add Library/User Library 比較不會有error訊息。

2. 加入User Library 步驟


1. Right-click the project in Eclipse and select "Build Path -> Add Libraries...".
2. Select User Library from the list and click Next.
3. Click the "User Libraries..." button.
4. Click "New..." in the User Libraries dialog.
5. Give the user library a name and select the System library checkbox and click OK.
6. Highlight the newly added user library in the list and click the "Add JARs..." button and add the desired jar files.
7. Click OK on the User Libraries dialog.
8. Make sure the new user library is checked in the Add Library dialog.

2012年10月18日 星期四

(Android Note) 實現全屏方式

1. 在AndroidManifest.xml 文件中,設定Activity為全屏模式。

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 

2. 程式實現全屏

2.1 隱藏狀態欄

requestWindowFeature(Window.FEATURE_NO_TITLE); 

2.2 隱藏標題欄

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

2.3 隱藏工具欄

此處搜尋過,無法強制隱藏工具欄。


PS: 以程式實現全屏,必須'放在 setContentView 前才有效果。

(Android Note) 讀取無線網卡mac位置

1. 添加權限


在AndroidManifest.xml加入存取無線網卡狀態權限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允許讀取WIFI狀態 -->


2.code 


//讀取無線網卡mac位置
public String getLocalWiFiMacAddress() {
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wm.getConnectionInfo();
return wi.getMacAddress(); //回傳(XX:XX:XX:XX:XX)
}

2012年10月4日 星期四

(Android Note) webview Javascript使用方法


1. code

String str = "<html><head></head><body>" +
    "<button onClick='javascript:js.setJava(\"HELLO\")' >執行java的function做處理</button>" +
    "<div id='output'>output:</div>" +
        "<script>document.write(js.getJava());</script>" +
    "</body></html>";
    
    wv = (WebView)findViewById(R.id.webView1);
    wv.addJavascriptInterface(this, "js"); 
    wv.getSettings().setJavaScriptEnabled(true); 
    wv.loadDataWithBaseURL("about:blank",str, "text/html", "utf-8", null); 



 public void setJava(String value){
Log.e("HELLO", value);
}
 public String getJava(){
        return "HELLO";
}

2. 說明

  •  javascript:js.setJava(\"HELLO\"); //呼叫 java中的程式function
  • <script>document.write(js.getJava());</script> //從java中的function取得值
  • wv.addJavascriptInterface(this, "js"); // 設定webview和javascript溝通的橋梁,別名js
  •  wv.getSettings().setJavaScriptEnabled(true); //是否允許webveiw執行javascript代碼
  • wv.loadDataWithBaseURL("about:blank",str, "text/html", "utf-8", null); //帶入字串
  • wv.loadUrl("http://XXX/aaa.php"); //帶入網址
  • wv.loadUrl(file:///android_asset/aaa.html); //帶入檔案,檔案位置必須要放置assets/www目錄下才可。至於大多人說放置assets就可以使用,在下是執行都會錯誤




(Android Note) listview 背景用法

1. Code

1.1 點選 listview 時,去除背景黑色底色

android:cacheColorHint="@android:color/transparent"

1.2 自動產生背景色


1.2.1 先在 drawable 資料夾內產生 dlistview.xml 檔案

內容:



<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 沒有焦點時的背景圖片 -->
<item android:state_window_focused="false" android:drawable="@drawable/tools_listviewbackground" />
<!-- 非觸摸試下獲得焦點並點選時的背景圖片 -->
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/tools_listviewbackground" />
<!-- 觸摸試下獲得焦點並點選時的背景圖片 -->
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/answer3_1" />
<!-- 選中時的背景圖片 --> 
<item android:state_selected="true" android:drawable="@drawable/answer4_1" />
<!-- 獲得焦點時的背景圖片 -->
<item android:state_focused="false" android:drawable="@drawable/answer4_2" />
</selector>

//android:state_selected是被點選
//android:state_focused是獲得焦點
//android:state_pressed是點擊
//android:state_enabled是否可以執行


1.2.2 在java中加入以下
listview.setSelector(R.drawable.dlistview); //把xml加入到背景選擇器

之後listview所產生的行為,會依照所定義xml格式所表現。


2012年8月31日 星期五

(Android Note) 對 EditText 取得和取消 foucs

1. Code


EditText et = (EditText) this.findViewById(R.id.et);
et.requestFocus(); //取得 foucs
et.clearFocus(); //取消 foucs

EditText多個同時使用requestFocus()時,只會執行最後呼叫 requestFocus()。

(Android Note) 呼叫鍵盤

1. Code

1.1 呼叫鍵盤功能,如果鍵盤顯示狀態就隱藏、鍵盤隱藏狀態就顯示。

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

1.2 只隱藏鍵盤

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);

2012年8月22日 星期三

(Android Note) List用法

1. code

List li = new ArrayList();

(1)add會將值放置到list的後端, function ==> list.add(value)

list.add(1);
list.add(2);
list.add(3);

retrun [1,2,3]

(2)0是list第一個位置,所以會將值放置在前端, function ==> list.add(0,value)



list.add(0,1);
list.add(0,2);
list.add(0,3);


retrun [3,2,1]

(3) 從現有list插入值, list = [1,2,3,4,5] 

list.add(1,99); 
retrun [1,99,2,3,4,5]

(4) 從現有的list取出值, list = [1,2,3,4,5] 

list.get(0) ; 
return 1;

(5)從現有的list搜尋是否有值, list = [1,2,3,4,5] 

list.indexOf(1);
找到值會回傳位置, return 0; 

list.indexOf(99);
找不到值會回傳-1, return -1; 


(6)從現有的list刪除值, list = [1,2,3,4,5] 

list.remove(2);
return list = [1,3,4,5]





(Android Note) List 容易出錯的部分

1. Code 


class A{
public int a;
}

(1) return [4,4,4,4,4]

public List<A> WordCard1(){  
        
List<A> li = new ArrayList<A>();
        
        A aa;
        aa = new A();      
        for(int i=0; i<5); i++){
            aa.a = i
            li.add(aa);
        }            
return li;
 }



(2) return [0,1,2,3,4]
public List<A> WordCard1(){  
        
List<A> li = new ArrayList<A>();
        
        A aa;
         
        for(int i=0; i<5); i++){
            aa = new A();
            aa.a = i
            li.add(aa);
        }            
 return li;
 }




2012年8月21日 星期二

(Android Note) List 和 ArrayList 差別

1. Article


(1) List是一個interface,ArrayList or LinkedList是實現interface的class。
                            List li = new ArrayList();

(2) List 是一個有序的集合,有序的集合是指每個元素都有自己的位置。


2012年8月9日 星期四

(Android Note) 設定圖片顯示/隱藏

1. Article 


andoird view 的設定隱藏方法 setVisibility(value),
value = 0,意思是可見。
value = 4,意思是不可見的但佔用空間。
value = 8,意思是不可見的但不佔用空間。

2012年8月8日 星期三

(Android Note) 抓取節析度大小


1. Code


 DisplayMetrics metrics = new DisplayMetrics();    getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.widthPixels;//屏寬
metrics.heightPixels;//屏高
metrics.densityDpi;//DPI


再根據Layout 大小作調整,使用setWidth、setHeight。

2012年7月26日 星期四

(Android Note) 了解螢幕解析度機制

1. Introduction


        目前手機或平板電腦市場,有各種不同節析度存在,為了要讓美工製圖能呈現最優質的畫質,必須要了解圖片擺放位置和解析度格式。


2. Article


2.1 圖型資料夾


        圖形資源分配可分成5種資料夾格式,drawable、drawable-xhdpi、drawable-hdpi、drawable-mhdpi、drawable-ldpi,每種資料夾所支援節析度格式也會不同,稍後2.3說明。手機會依照螢幕節析度的需求,會自動尋找到適合的圖片。




2.2   AndroidManifest.xml 設定


需要在 AndroidManifest.xml 內加入以下語法,手機才會自動抓到符合本身螢幕節析度資源。


<supports-screens
          android:largeScreens="true"
          android:normalScreens="true"
          android:smallScreens="true"
          android:anyDensity="true" />


2.3 節析度格式


       由圖中紅框可以看到,ldpi (密度值 120) 最佳支援 WQVGA400 (240X400) WQVGA432 (240X432)、mdpi (密度值 160) 最佳支援 HVGA (320X480)、hdpi (密度值 240) 最佳支援 WVGA800 (480X800) WVGA854 (480X854)  600X1024、xhdpi (密度值 320) 最佳支援 640X960。



     在這邊簡單說明密度值的作用,如果要在不同的手機或平板電腦看到一樣節析度的畫質,就必須依照資料夾的密度作調整。
EX:
mdpi 放置一張 100X100的照片
1. 
有支手機支援 drawable-ldpi格式,所需要 ldpi 密度為120是mdpi的0.75倍,圖片在手機上會自動調整最佳節析度大小,呈現75X75。
2.
有支手機支援 drawable-hdpi格式,所需要 hdpi 密度為240是mdpi的1.5倍,圖片在手機上會自動調整最佳節析度大小,呈現150X150小部分失真。
3.
有支手機支援 drawable-xhdpi格式,所需要 xhdpi 密度為320是mdpi的2倍,圖片在手機上會自動調整最佳節析度大小,呈現200X200大部分失真。
4.
把drawable-*等資料夾都刪除,只留下drawable資料夾,在手機上的圖形會依照原本繪製大小1:1的呈現。


3. 手機和平板規格


3.1 Density 120


遠傳小精靈(320x240)
HTC野火機1代(320x240)


3.2 Density 160

HTC Hero(480x320)
HTC Flyer平板(1024x600)

3.3 Density 170


Samsung Tab 7.7(1024x600)

3.4 Density 240

Nexus one(800x480)
Nexus S(800x480)
HTC Desire(800x480)
HTC Incredible(800x480)
Sony Arc(854x480)
Samsung SII(800x480)

3.5 Density 320

Galaxy Nexus(1280x720)

3.6 規格

QVGA = 320 * 240;
WQVGA = 320 * 480;
WQVGA2 = 400 * 240;
WQVGA3 = 432 * 240;
HVGA = 480 * 320;
VGA = 640 * 480;
WVGA = 800 * 480;
WVGA2 = 768 * 480;
FWVGA = 854 * 480;
DVGA = 960 * 640;
PAL = 576 * 520;
NTSC = 486 * 440;
SVGA = 800 * 600;
WSVGA = 1024 * 576;
XGA = 1024 * 768;
XGAPLUS = 1152 * 864;
HD720 = 1280 * 720;
WXGA = 1280 * 768;
WXGA2 = 1280 * 800;
WXGA3 = 1280 * 854;
SXGA = 1280 * 1024;
WXGA4 = 1366 * 768;
SXGAMINUS = 1280 * 960;
SXGAPLUS = 1400 * 1050;
WXGAPLUS = 1440 * 900;
HD900 = 1600 * 900;
WSXGA = 1600 * 1024;
WSXGAPLUS = 1680 * 1050;
UXGA = 1600 * 1200;
HD1080 = 1920 * 1080;
QWXGA = 2048 * 1152;
WUXGA = 1920 * 1200;
TXGA = 1920 * 1400;
QXGA = 2048 * 1536;
WQHD = 2560 * 1440;
WQXGA = 2560 * 1600;
QSXGA = 2560 * 2048;
QSXGAPLUS = 2800 * 2100;
WQSXGA = 3200 * 2048;
QUXGA = 3200 * 2400;
QFHD = 3840 * 2160;
WQUXGA = 3840 * 2400;
HD4K = 4096 * 2304;
HXGA = 4096 * 3072;
WHXGA = 5120 * 3200;
HSXGA = 5120 * 4096;
WHSXGA = 6400 * 4096;
HUXGA = 6400 * 4800;
SHV = 7680 * 4320;
WHUXGA = 7680 * 4800;



2012年7月25日 星期三

(Android Note) 拖曳圖片

1. 說明: 拖曳icon, 並且記錄 icon目前位置

2. Drag_Drop.java

package com.kochi.knowhow;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Drag_Drop extends Activity {
    /** Called when the activity is first created. */
private ImageView img;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drag_drop);
        img = (ImageView)findViewById(R.id.dragdropImageView1);
        img.setOnTouchListener(imgListener);
    }
 
    private OnTouchListener imgListener = new OnTouchListener(){
    private float x, y; //原本圖片存在的X,Y軸位置
    private int mx, my; //圖片被拖曳的X ,Y軸距離長度
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
//Log.e("View", v.toString());
switch(event.getAction()) {  
//按下圖片時
case MotionEvent.ACTION_DOWN:  
                x = event.getX();  
                y = event.getY();
            //移動圖片時
            case MotionEvent.ACTION_MOVE:  
                mx = (int)(event.getRawX() - x);  
                my = (int)(event.getRawY() - 50 - y); //50應該是標題框長度
                v.layout(mx, my, mx + v.getWidth(), my + v.getHeight());  
                break;  
            }
Log.e("address", String.valueOf(mx)+"~~"+String.valueOf(my)); //記錄目前位置
            return true;  
}
    };
}

3. drag_drop.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:src="@drawable/icon"
    android:id="@+id/dragdropImageView1"></ImageView>

</LinearLayout>






(Android Note) 設定,取得偏好設定SharedPreferences

1. 說明: 利用SharedPreferences類別, 設定和取得偏好設定內容(姓名,生日,電話)

2. SetGetSharedPreferences.java


package com.kochi.knowhow;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class SetGetSharedPreferences extends Activity{
private EditText name;
private EditText birthday;
private EditText tel;
private Button set;
private Button get;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sharedpreferences);
        name = (EditText) findViewById(R.id.spName);
        birthday = (EditText) findViewById(R.id.spBirthday);
        tel = (EditText) findViewById(R.id.spTel);
        set = (Button) findViewById(R.id.spSet);
        get = (Button) findViewById(R.id.spGet);
       
        set.setOnClickListener(setListener); //設定監聽模式
        get.setOnClickListener(getListener); //取得監聽模式
}
//按下設定按鈕
private OnClickListener setListener = new OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

//getSharedPreferences(String name,int mode) , name為設定檔名稱
//MODE_PRIVATE : 只有此程式可以存取
//MODE_WORLD_READABLE : 其它程式也可以讀取
        //MODE_WORLD_WRITEABLE : 其它程式可以寫
//MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE : 其它程式可讀取寫入
SharedPreferences setting = getSharedPreferences("SP", MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE);
//把name,birthday,tel變數儲存Name,Birthday,Tel屬性, 必須要加入.commit()才會建立此檔案
setting.edit().putString("Name",name.getText().toString()).commit();
setting.edit().putString("Birthday",birthday.getText().toString()).commit();
setting.edit().putString("Tel",tel.getText().toString()).commit();

//清空EditText內容
name.setText("");
birthday.setText("");
tel.setText("");
}

};
//按下取得按鈕
private OnClickListener getListener = new OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

//getSharedPreferences(String name,int mode) , name為設定檔名稱
SharedPreferences getting = getSharedPreferences("SP", 0);
//讀取Name屬性值,再顯示EditText框架上
name.setText(getting.getString("Name", ""));
//讀取Birthday屬性值,再顯示EditText框架上
birthday.setText(getting.getString("Birthday", ""));
//讀取Tel屬性值,再顯示EditText框架上
tel.setText(getting.getString("Tel", ""));
}

};
}

3. sharedpreferences.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView android:text="姓名" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:layout_height="wrap_content" android:text="" 
    android:id="@+id/spName" android:layout_width="match_parent" android:inputType="text"></EditText>
    <TextView android:text="生日" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:layout_height="wrap_content" android:text="" 
    android:id="@+id/spBirthday" android:layout_width="match_parent" android:inputType="date"></EditText>
    <TextView android:text="電話" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:layout_height="wrap_content" android:text="" 
    android:id="@+id/spTel" android:layout_width="match_parent" android:inputType="number"></EditText>
   
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button android:text="設定" android:id="@+id/spSet" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Button android:text="取得" android:id="@+id/spGet" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </LinearLayout>
   
</LinearLayout>

4. 執行步驟
a. 輸入內容,按下設定按鈕

b. 按下設定按鈕後,清空EditText 

c. 按下取得按鈕, 會讀取在偏好設定的值

5. 偏好設定會存在
(/data/data/com.kochi.knowhow/shared-prefs/SP.xml)
以下權限為 MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE : 其它程式可讀取