Android 範例程式
2016年6月29日 星期三
多執行緒範例
public class MainActivity extends Activity {
private TextView timer1, timer2;
private Button start1, stop1, zero1, start2, stop2, zero2, end;
private int timesec1=0, timesec2=0, csec1=0, csec2=0, cmin1=0, cmin2=0;
// 宣告執行緒 Thread1
ClockThread1 thread1 = new ClockThread1();
// 宣告執行緒 Thread2
ClockThread2 thread2 = new ClockThread2();
// 宣告 Handler
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer1 = (TextView)findViewById(R.id.timer1);
start1 = (Button)findViewById(R.id.start1);
stop1 = (Button)findViewById(R.id.stop1);
zero1 = (Button)findViewById(R.id.zero1);
timer2 = (TextView)findViewById(R.id.timer2);
start2 = (Button)findViewById(R.id.start2);
stop2 = (Button)findViewById(R.id.stop2);
zero2 = (Button)findViewById(R.id.zero2);
end = (Button)findViewById(R.id.end);
start1.setOnClickListener(listener);
start2.setOnClickListener(listener);
stop1.setOnClickListener(listener);
stop2.setOnClickListener(listener);
zero1.setOnClickListener(listener);
zero2.setOnClickListener(listener);
end.setOnClickListener(listener);
}
// 第一個執行緒
public class ClockThread1 extends Thread {
public void run(){
timesec1++;
csec1 = timesec1 % 60;
cmin1 = timesec1 / 60;
String s = "";
if (cmin1 < 10){
s = "0" + cmin1;
} else {
s = "" + cmin1;
}
if (csec1 < 10){
s = s + ":0" + csec1;
} else {
s = s + ":" + csec1;
}
timer1.setText(s);
//每次執行Thred1只會執行一次,必須靠延遲1秒後執行Handler來進行重複執行
handler.postDelayed(thread1, 1000);
}
}
// 第二個執行緒
public class ClockThread2 extends Thread {
public void run(){
timesec2++;
csec2 = timesec2 % 60;
cmin2 = timesec2 / 60;
String s = "";
if (cmin2 < 10){
s = "0" + cmin2;
} else {
s = "" + cmin2;
}
if (csec2 < 10){
s = s + ":0" + csec2;
} else {
s = s + ":" + csec2;
}
timer2.setText(s);
handler.postDelayed(thread2,1000);
}
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.start1:
//開始
handler.post(thread1);
break;
case R.id.stop1:
//停止(移除呼叫執行緒)
handler.removeCallbacks(thread1);
break;
case R.id.zero1:
timesec1 = 0;
timer1.setText("00:00");
break;
case R.id.start2:
handler.post(thread2);
break;
case R.id.stop2:
handler.removeCallbacks(thread2);
break;
case R.id.zero2:
timesec2 = 0;
timer2.setText("00:00");
break;
case R.id.end:
finish();
break;
}
}
};
}
註:
一、對 Thread 程式完全陌生,找到一個寫法很簡潔的範例,因此將程式碼收藏下來以便於往後參考之用。
二、程式碼來源
範例下載
2016年6月27日 星期一
以Intent啟動其它Activity
public class MainActivity extends Activity {
private EditText medtName, medtAge;
private Button mbtnOK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
medtName = (EditText) findViewById(R.id.edtName);
medtAge = (EditText) findViewById(R.id.edtAge);
mbtnOK = (Button) findViewById(R.id.btnOK);
mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}
private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent it = new Intent(MainActivity.this, SecondActivity.class);
// it.putIntExtra("姓名", "John"); // 存入以「姓名」為鍵值的資料「John」
it.putExtra(getString(R.string.s_txtName), medtName.getText().toString());
it.putExtra(getString(R.string.s_txtAge), medtAge.getText().toString());
startActivity(it);
}
};
}
public class SecondActivity extends Activity {
private TextView mtxtName2, mtxtAge2;
private Button mbtnPrv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mtxtName2 = (TextView) findViewById(R.id.txtName2);
mtxtAge2 = (TextView) findViewById(R.id.txtAge2);
mbtnPrv = (Button) findViewById(R.id.btnPrv);
mbtnPrv.setOnClickListener(mbtnPrvOnClickListener);
Intent it = getIntent();
// it.getStringExtra("姓名"); 讀出名為「姓名」的 String 資料
// it.getIntExtra("年齡", 18); 讀出名為「年齡」的 Int 資料, 若沒有則傳回 18
String tmpName = it.getStringExtra(getString(R.string.s_txtName));
String tmpAge = it.getStringExtra(getString(R.string.s_txtAge));
mtxtName2.setText(getString(R.string.s_txtName) + tmpName);
mtxtAge2.setText(getString(R.string.s_txtAge) + tmpAge);
}
private View.OnClickListener mbtnPrvOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
};
2016年6月26日 星期日
JSON 資料讀取簡易版
public class MainActivity extends Activity {
private Button mbtnOK;
private TextView mtxtR;
String uri = "http://mis.ndhu.edu.tw/android/json.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbtnOK = (Button) findViewById(R.id.btnOK);
mtxtR = (TextView) findViewById(R.id.txtR);
mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}
private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
HttpGet httpGetRequest = new HttpGet(uri);
try {
HttpResponse httpResponse = new DefaultHttpClient().execute(httpGetRequest);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
JSONArray jsonarr = new JSONArray(result);
String TmpStr = "";
for (int i=0; i<jsonarr.length(); i++) {
JSONObject lib = jsonarr.getJSONObject(i);
TmpStr += getString(R.string.s_name) + lib.getString("name") + "\n";
TmpStr += getString(R.string.s_addr) + lib.getString("addr") + "\n\n" ;
}
mtxtR.setText(TmpStr);
}
} catch (Exception e) {
mtxtR.setText(e.getMessage());
}
}
};
}
2016年6月25日 星期六
JSON 讀取測試
public class MainActivity extends Activity {
private Button btnParse;
private ListView listResult;
String[] libAdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnParse = (Button) findViewById(R.id.btn_parse);
btnParse.setOnClickListener(btnOKOnClickListener);
listResult = (ListView) findViewById(R.id.list_result);
listResult.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, getString(R.string.Address) + libAdd[position],
Toast.LENGTH_LONG).show();
}
});
}
public View.OnClickListener btnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String[] libName = parseJSONData(getJSONData());
ArrayAdapter
MainActivity.this,
android.R.layout.simple_expandable_list_item_1,
libName);
listResult.setAdapter(listAdapter);
}
};
private JSONArray getJSONData() {
String uri = "http://mis.ndhu.edu.tw/android/json.php";
HttpGet httpget = new HttpGet(uri);
try {
HttpResponse httprspns = getHttpclient().execute(httpget);
String result = EntityUtils.toString(httprspns.getEntity(), HTTP.UTF_8);
Log.e("result", result);
JSONArray jsonarr = new JSONArray(result);
return jsonarr;
} catch (Exception e) {
return null;
}
}
private String[] parseJSONData(JSONArray dataInput) {
try {
String[] libName = new String[dataInput.length()];
String[] libAddress = new String[dataInput.length()];
for (int i=0; i<dataInput.length(); i++) {
JSONObject lib = dataInput.getJSONObject(i);
Log.e("name", lib.getString("name"));
Log.e("addr", lib.getString("addr"));
libName[i] = lib.getString("name");
libAddress[i] = lib.getString("addr");
}
libAdd = libAddress;
return libName;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
private DefaultHttpClient getHttpclient() {
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 3000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
return httpclient;
}
}
註:
一、程式碼來源及教學參考此連結
二、教學中的 Open Data 來源有問題,已把顯示相同格式的資料移至他處。
Http Post 參數傳遞
public class MainActivity extends Activity {
private EditText medtMessage;
private Button mbtnOK;
private TextView mtxtShow;
private String uri = "http://mis.ndhu.edu.tw/android/response_post_android.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
medtMessage = (EditText)findViewById(R.id.edtMessage);
mbtnOK = (Button)findViewById(R.id.btnOK);
mtxtShow = (TextView) findViewById(R.id.txtShow);
mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}
private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
HttpPost httpPostRequest = new HttpPost(uri);
List
httpParams.add(new BasicNameValuePair("name", medtMessage.getText().toString()));
try {
httpPostRequest.setEntity(new UrlEncodedFormEntity(httpParams, HTTP.UTF_8));
HttpResponse httpResponse = new DefaultHttpClient().execute(httpPostRequest);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// String result = EntityUtils.toString(httpResponse.getEntity()); // 中文會亂碼
String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
// result = result.replaceAll("\r\n|\n\r|\r|\n", "");
mtxtShow.setText(result);
}
} catch (Exception e) {
mtxtShow.setText("連線錯誤:" + e.getMessage());
}
}
};
}
範例下載
再按一次返回鍵結束程式
public class MainActivity extends Activity {
//判斷離開的flag,設定成全域變數
private boolean is_exit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean returnValue = false;
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && is_exit == false) {
Toast.makeText(getBaseContext(), getText(R.string.str_notice_ExitonDoubleKeyDown), Toast.LENGTH_SHORT).show();
is_exit = true;
// 一開始 先設定 返回的 flag = true ,若使用者兩秒內沒有動作,則將該 flag 恢復為 false
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
is_exit = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
returnValue = true;
} else {
returnValue = super.onKeyDown(keyCode, event);
}
return returnValue;
}
}
註:程式碼來源由網路查得
下載範例
2016年6月19日 星期日
偵測螢幕解析度
public class MainActivity extends Activity {
private TextView mtxtX, mtxtY, mtxtDPI;
private Button mbtnOK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtxtX = (TextView) findViewById(R.id.txtX);
mtxtY = (TextView) findViewById(R.id.txtY);
mtxtDPI = (TextView) findViewById(R.id.txtDPI);
mbtnOK = (Button) findViewById(R.id.btnOK);
mbtnOK.setOnClickListener(OnbtnOKClickCistener);
}
private View.OnClickListener OnbtnOKClickCistener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 手機的寬度(像素)
int mWidth = getResources().getDisplayMetrics().widthPixels;
// 手機的高度(像素)
int mHeight = getResources().getDisplayMetrics().heightPixels;
// 手機的DPI
float mDpi = getResources().getDisplayMetrics().densityDpi;
mtxtX.setText(getString(R.string.S_txtX) + Integer.toString(mWidth));
mtxtY.setText(getString(R.string.S_txtY) + Integer.toString(mHeight));
mtxtDPI.setText(getString(R.string.S_txtDPI) + Float.toString(mDpi));
}
};
}
範例程式
訂閱:
意見 (Atom)








