2013年10月23日 星期三

[TQC+ Android]SQLite 與 MENU 作業_204

Android 2.1 API 7 版本原始題目載點:https://db.tt/BXZjHsRH

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/TQC204.pdf

GDD02.java - Activity主體
package COM.TQC.GDD02;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class GDD02 extends Activity
{
  private mySQLiteOpenHelper gaaSQLiteOpenHelper;
  private Cursor myCursor;
  private ListView myListView;
  private EditText myEditText;
  private int _id;
  protected final static int MENU_ADD = Menu.FIRST;
  protected final static int MENU_EDIT = Menu.FIRST + 1;
  protected final static int MENU_DELETE = Menu.FIRST + 2;

  @Override
  public boolean onOptionsItemSelected(MenuItem item)
  {
    super.onOptionsItemSelected(item);
    switch (item.getItemId())
    {
      case MENU_ADD:
        this.addTodo();
        break;
      case MENU_EDIT:
        this.editTodo();
        break;
      case MENU_DELETE:
        this.deleteTodo();
        break;
    }
    return true;
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {
    super.onCreateOptionsMenu(menu);
    //first
    menu.add(0, MENU_ADD, 0, getString(R.string.strAddButton));
    menu.add(0, MENU_EDIT, 0, getString(R.string.strEditButton));
    menu.add(0, MENU_DELETE, 0, getString(R.string.strDeleteButton));
    //
    return true;
  }

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myListView = (ListView) this.findViewById(R.id.myListView);
    myEditText = (EditText) this.findViewById(R.id.myEditText);

    gaaSQLiteOpenHelper = new mySQLiteOpenHelper(this);
    
    myCursor = gaaSQLiteOpenHelper.select();

    
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list,
        myCursor, new String[]
        { gaaSQLiteOpenHelper.FIELD_TEXT }, new int[]
        { R.id.listTextView1 });
    myListView.setAdapter(adapter);

    
    myListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {

      
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
          long arg3)
      {
        
        myCursor.moveToPosition(arg2);
        
        _id = myCursor.getInt(0);
        
        myEditText.setText(myCursor.getString(1));
      }

    });
   

  }

  private void addTodo()
  {
   //second call  gaaSQLiteOpenHelper SQL insert method
   gaaSQLiteOpenHelper.insert(myEditText.getText().toString());
   myCursor.requery();
   
 //  
  }

  private void editTodo()
  {
    
 //second call  gaaSQLiteOpenHelper SQL update method
   gaaSQLiteOpenHelper.update(_id, myEditText.getText().toString());
   myCursor.requery();
 //
   
  }

  private void deleteTodo()
  {
 //second call  gaaSQLiteOpenHelper SQL delete method
   gaaSQLiteOpenHelper.delete(_id);
   myCursor.requery();
 //
   
  }
}


mySQLiteOpenHelper
package COM.TQC.GDD02;

import java.nio.charset.CodingErrorAction;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class mySQLiteOpenHelper extends SQLiteOpenHelper
{
  private final static String DATABASE_NAME = "todo_db";
  private final static int DATABASE_VERSION = 1;
  private final static String TABLE_NAME = "todo_table";
  public final static String FIELD_id = "_id";
  public final static String FIELD_TEXT = "todo_text";

  public mySQLiteOpenHelper(Context context)
  {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db)
  {
    
    String sql = "CREATE TABLE " + TABLE_NAME + " (" + FIELD_id
        + " INTEGER primary key autoincrement, " + " " + FIELD_TEXT + " text)";
    db.execSQL(sql);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  {
    String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
    db.execSQL(sql);
    onCreate(db);
  }

  public Cursor select()
  {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
    return cursor;
  }

  public void insert(String text)
  {
    SQLiteDatabase db = this.getWritableDatabase();
    // add date
    ContentValues cv = new ContentValues();
    cv.put(FIELD_TEXT, text);
    db.insert(TABLE_NAME, null, cv);
    //
    
  }

  public void delete(int id)
  {
    SQLiteDatabase db = this.getWritableDatabase();
    //
    String where = FIELD_id + " = " + id;
    // delete date
    db.delete(TABLE_NAME, where, null);
    //
    
  }

  public void update(int id, String text)
  {
    SQLiteDatabase db = this.getWritableDatabase();
    //
    String where = FIELD_id + " = " + id;
    // update date
    ContentValues cv = new ContentValues();
    cv.put(FIELD_TEXT, text);
    
    db.update(TABLE_NAME, cv, where, null);
    
    //
    
  }
}

以下圖片為android程式建立的database所在位置

2013年9月2日 星期一

[TQC+ Android]題庫、環境設置及eclipse使用技巧

Android JDK 及 eclipse安裝設置參考
http://sofun.tw/android-eclipse/

Android 題目以及題庫掃描檔案連結
https://db.tt/4ylbqp9g

1.寫作技巧記住函數開頭後面只要用點的( . )都能夠做出來,只要變數名稱沒取錯
2.當打出部分函數時,可以使用快捷鍵( alt  +  / )可以選擇完整函數(如doc打指令Tab)
3.如果需要import大量變數可使用快捷鍵(alt + shift + o)
3.對@Override 之上空白 按右鍵Source > Override/Implement Method 有許多實作方法
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
4. new部分可用View. 出 OnClickListener() 在改回Button(不更改也可執行,以防分數被扣)
也可使用new Button.OnClickListener(){} 加上小括號、中括號後實做
 Button b1 = (Button) findViewById(R.id.button1);
    b1.setOnClickListener(new Button.OnClickListener()
    {
      public void onClick(View v)
      {

5.當有兩個java黨互動或接收簡訊等action都需要去AndroidManifest.xml設置權限及Action
通常會用到intent時都需要
6.新建專案 四大步驟
第一步驟: src 建立 .java 
第二步驟: 建立 onCreate (第3點) (連結第三步驟 setContentView(R.layout.XXXXX);  layout
第三步驟: layout 建立 .xml檔案
第四步驟: androidMainifest.xml 啟動 action

Android 台灣開發者社群

陳翰瑀‎
分享一下我個人常用的Eclipse快捷鍵

alt + / 程式碼自動補全/提示
alt + shift + z Suround with(ex.try catch block)

tab 縮排
shift + tab 反縮排

ctrl + f 搜尋
ctrl + l 直接跳到輸入的行數
ctrl + a 全選
shift + home 從後往前選一排
shift + end 從前往後選一排

ctrl + x 剪下
ctrl + c 複製
ctrl + v 貼上
ctrl + / mark(備註)/反mark(反備註)
ctrl + s 存檔

ctrl + shift +f 自動排版
ctrl + shift +o 自動import
ctrl + shift +r 尋找並開啟檔案

另外還有範圍較大的 工作區搜尋
ctrl + h 我都使用file search比較多(找所有檔案內相同的字串)

特別設定
http://fahdshariff.blogspot.tw/2011/08/eclipse-default-to-file-search-tab-in.html?m=1

蔡昇哲
ctrl + w, 關單一檔案
ctrl + i, 單行排版
ctrl + alt + s, source (主要常用在override)
ctrl + alt + t, refactor
ctrl + q, 跳到最後修改處
ctrl + [; ctrl + ] 在跳行上很好用

Rick Wu
反白某變數 ctrl+k 逐一尋找該變數
反白某函數/類別/layout 按f3或ctrl按住+滑鼠左鍵 可跳至該函數/類別/xml宣告的地方

[TQC+ Android]接收SMS_302

Android 2.1 API 7 版本原始題目載點:http://db.tt/WiNMXEQ6

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/302.png

GDD03.SMSreceiver - BroadcastReceiver
先在AndroidManifest.xml設定user permission,在設定activity和receive
package COM.TQC.GDD03;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class SMSreceiver extends BroadcastReceiver {
    
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Intent mainIntent = new Intent(context, Image.class);
            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mainIntent);
        }
    }
}

[TQC+ Android]公尺與英呎轉換_202

Android 2.1 API 7 版本原始題目載點:http://db.tt/hHVh21bO

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/TQC202.pdf

GDD02.java - Activity主體
因為layout為線性排列所以擺放Button時,需要再選擇relation layout再擺放兩個Button
package COM.TQC.GDD02;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class GDD02 extends Activity implements OnClickListener{
    private TextView result;
    private EditText input_value;
    private Button submit01, submit02;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        result = (TextView) findViewById(R.id.result);
        input_value = (EditText) findViewById(R.id.input_value);
        submit01 = (Button) findViewById(R.id.submit01);
        submit02 = (Button) findViewById(R.id.submit02);
        
        submit01.setOnClickListener(this);
        submit02.setOnClickListener(this);
    }

    public void onClick(View v) {
        String r = input_value.getText().toString();
        
        if (v == submit01)
            r += ".0公尺 = " + String.format("%.2f", Double.parseDouble(r) * 3.28) + "英呎";
        else if (v == submit02)
            r += ".0英呎 = "+ String.format("%.2f", Double.parseDouble(r) * 0.3048) + "公尺";
        
        result.setText(r);
    }
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_reset:
            resetValue();
            break;
        }
        return true;
    }

    private void resetValue() {
        result.setText("");
        input_value.setText("");
    }
}

[TQC+ Android]動態密碼顯示_110

Android 2.1 API 7 版本原始題目載點:http://db.tt/7DRVeeKb

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/TQC110.pdf

GDD01.java - Activity主體
package COM.TQC.GDD01;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;


public class GDD01 extends Activity {
 private EditText et;
 private CheckBox cb;
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    et = (EditText) findViewById(R.id.mPassword);
    cb = (CheckBox) findViewById(R.id.mCheck);
    
    cb.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){

  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   // TODO Auto-generated method stub
   if(cb.isChecked()){
    et.setTransformationMethod(
                  HideReturnsTransformationMethod.getInstance());
   }else{
    et.setTransformationMethod(
                  PasswordTransformationMethod.getInstance());
   }
  }
     
    });
  }
}

2013年8月28日 星期三

[TQC+ Android]程式背景音樂_310

Android 2.1 API 7 版本原始題目載點:http://db.tt/87GSYroH

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/TQC310.pdf

GDD03.java - Activity主體
package COM.TQC.GDD03;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;

public class GDD03 extends Activity
{
 //宣告MediaPlayer類別來使用,記得Import
   private MediaPlayer m;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  //建立物件實體於this,音樂檔的路徑為res\raw\light
    m = MediaPlayer.create(this, R.raw.light);
    //播放音樂
    m.start();
    //設定播放迴圈為true,即為循環播放
    m.setLooping(true);
  }
@Override
protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 //當重新開起app程式至onResume時,重設音樂播放
 m.reset();
}
}

[TQC+ Android]接收簡訊_304

Android 2.1 API 7 版本原始題目載點:http://db.tt/FV8IPpEf

僑光科技大學 蔡存孝老師 解說參考:http://rs2.ocu.edu.tw/~tsay/files/304.png

AndroidManifest.xml設定
Permissions裡 "add" (User Permissions) Name = android.permission.RECEIVE_SMS
Application裡 "add" (Receiver) Name = GDA03_SM_Receiver 再 "add" Intent Filter 再 "add" (Action) Name =  android.provider.Telephony.SMS_RECEIVED

GDD03_SM_Receiver - BroadcastReceiver

package COM.TQC.GDD03 ;

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;



public class GDD03_SM_Receiver extends BroadcastReceiver 
{ 
   
 
  
  @Override 
  public void onReceive(Context context, Intent intent) 
  { 
    // TODO Auto-generated method stub 
    
     String str="";
     Bundle bundle = intent.getExtras();
     Object[] pdus=(Object[])bundle.get("pdus");
     SmsMessage[] m = new SmsMessage[pdus.length];
     for(int i=0; i < pdus.length; ++i) {
      m[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
      str+="接收來電>\n";
      str+=m[i].getDisplayOriginatingAddress();
      str+="\n---簡訊內容---\n";
      str+=m[i].getMessageBody();
     }
     Toast.makeText(context, str, Toast.LENGTH_LONG).show();
     
     Intent intent2 = new Intent(context, GDD03.class);
     intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     context.startActivity(intent2);
   
   
   
   
   
   
  } 
}