2013年9月30日 星期一

Android 巢狀 nested ScrollView

//////////////////////////////////////////////////////////////////////////
public class ScrollActivity extends Activity {
     private ScrollView s1;
     private ScrollView s2;
     private ScrollView s3;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.scroll_layout);
          s1 = (ScrollView) findViewById(R.id.scrollView1);// 第一層
          s2 = (ScrollView) findViewById(R.id.scrollView2);// 第二層,內層請記得設定高度
          s3 = (ScrollView) findViewById(R.id.scrollView3);// 第三層,內層請記得設定高度
          s2.setOnTouchListener(new OnTouchListener() {

               @Override
               public boolean onTouch(View v, MotionEvent event) {
                    // 關掉第一層的觸控
                    s1.requestDisallowInterceptTouchEvent(true);
                    return false;
               }
          });
          s3.setOnTouchListener(new OnTouchListener() {

               @Override
               public boolean onTouch(View v, MotionEvent event) {
                    // 關掉第二層的觸控,也同時關掉第一層了!
                    s2.requestDisallowInterceptTouchEvent(true);
                    return false;
               }
          });
     }
}

2013年9月27日 星期五

Android EditText光標處插入字串

//////////////////////////////////////////////////////////////////////////
EditText e=(EditText)findViewById(R.id.editText);
StringBuffer str = new StringBuffer(e.getText().toString()); //取得EditText內容
str.insert(e.getSelectionEnd(), "Kagoo"); //1.取得光標的位置2.插入的字串
e.setText(str.toString()); //重新設定EditText內容
  

Android Sqlite 版本更新、資料結構更改

Android Sqlite 版本更新

/////////////////////////////////////////////////
//第一個版本
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 1; // 資料庫版本
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s INTEGER not null," + // 數量
    "%s INTEGER not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
--------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////
//第二個版本,增加一個資料表
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 2; // 資料庫版本,版本更新為2
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
// 儲位資料表(新增的資料表)
public final static String SPACENAME = "spacename"; // 儲位資料表名稱
public final static String SPACEMENU = "spacemenu"; // 儲位名稱

//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s INTEGER not null," + // 數量
    "%s INTEGER not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
    // 建立儲位資料表
    createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
     , SPACENAME, SPACEMENU);
     db.execSQL(createTable);

}
//如果是新安裝的用戶,會執行上面的onCreate()
//如果先前是已經安裝的用戶,會執行下面的 onUpgrade()
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == 1) {
          // 建立儲位資料表
          createTable = String.format("Create Table %s(" + // 資料表名稱
          "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
          , SPACENAME, SPACEMENU);
          db.execSQL(createTable);

          db.setVersion(newVersion);// 重新設定資料庫版本
    }
}
--------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////
//第三個版本,修改庫存資料表結構
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 3; // 資料庫版本,版本更新為3
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
// 儲位資料表(新增的資料表)
public final static String SPACENAME = "spacename"; // 儲位資料表名稱
public final static String SPACEMENU = "spacemenu"; // 儲位名稱

//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s REAL not null," + // 數量,原本為整數,改為浮點數
    "%s REAL not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
    // 建立儲位資料表
    createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
     , SPACENAME, SPACEMENU);
     db.execSQL(createTable);

}
//如果是新安裝的用戶,會執行上面的onCreate()
//如果先前是已經安裝的用戶,會執行下面的 onUpgrade()
//Android Sqlite 無法直接更改資料表結構,請參考下面的方法。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == 1) { //如果舊用戶的版本為1,直接更新到第3版
          // 建立儲位資料表
          createTable = String.format("Create Table %s(" + // 資料表名稱
          "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
          , SPACENAME, SPACEMENU);
          db.execSQL(createTable);

          updateStockTable(db);// 更新庫存資料表結構
          db.setVersion(newVersion);// 重新設定資料庫版本   
    }

    if (oldVersion == 2) { //如果舊用戶的版本為2,更新到第3版
          updateStockTable(db);// 更新庫存資料表結構
          db.setVersion(newVersion);// 重新設定資料庫版本
    }
}

private void updateStockTable(SQLiteDatabase db) {
         // 1.將舊的資料表名稱更名
         String updateTable = String.format("ALTER TABLE %s RENAME TO %s",
         TABLENAME, "temptable");
         db.execSQL(updateTable);


         // 2.創建一個新的資料表為舊表的名稱
         String createTable = String.format("Create Table %s(" + // 資料表名稱
           "%s VARCHAR(13) not null primary key," + // 品號-主鍵
           "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
           "%s REAL not null," + // 數量
           "%s REAL not null," + // 成本
           "%s VARCHAR(10) null)" // 儲位
          , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
         db.execSQL(createTable);
      

          // 3.將舊表寫入到新表
         updateTable = String.format("INSERT INTO %s SELECT * FROM %s",
           TABLENAME, "temptable");
         db.execSQL(updateTable);


         // 4.刪除舊表
         updateTable = String.format("DROP TABLE %s", "temptable");
         db.execSQL(updateTable);

}
以上方法僅供參考。