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));
}
};
}
範例程式
2016年6月17日 星期五
偏好設定_Preferences
public class MainActivity extends Activity {
private EditText medtName, medtAge;
private RadioGroup mradgrp;
private RadioButton mr1, mr2;
@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);
mradgrp = (RadioGroup) findViewById(R.id.radgrp);
mr1 = (RadioButton) findViewById(R.id.r1);
mr2 = (RadioButton) findViewById(R.id.r2);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); // 取得編輯器物件
editor.putString("姓名", medtName.getText().toString()); // 以字串型態儲存
editor.putInt("年齡", Integer.parseInt(medtAge.getText().toString())); // 以數字型態儲存
switch (mradgrp.getCheckedRadioButtonId()) {
case R.id.r1:
editor.putBoolean("性別", true); // 以布林型態儲存
break;
case R.id.r2:
editor.putBoolean("性別", false); // 以布林型態儲存
break;
}
editor.commit();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
SharedPreferences myRecord = getPreferences(MODE_PRIVATE);
medtName.setText(myRecord.getString("姓名", "無資料")); // 以「姓名」為 key 取值,若查無資料則回傳「無資料」字串。
medtAge.setText(Integer.toString(myRecord.getInt("年齡", 0))); // 以「年齡」為 key 取值,若查無資料則回傳數值「0」。
if (myRecord.getBoolean("性別", true)) { // 以「性別」為 key 取值,若查無資料則回傳布林值「true」。
mr1.setChecked(true);
} else {
mr2.setChecked(true);
}
}
}
範例下載
2016年6月16日 星期四
改變物件邊框及動作反應
一、如果要改變 TextView 元件顯示外觀:
- 在 res/drawable 檔案夾下建立一 XML File,例如「view_border.xml」並選取 shape 為根元件。
- 在新建立的 XML 檔下編輯如下內容
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 圓角 -->
<corners android:radius="8dp"/>
<!-- 外框線條 -->
<stroke android:width="2dp" android:color="@android:color/holo_orange_dark"/>
<!-- 文字與外框間隔 -->
<padding android:top="8dp" android:left="8dp" android:bottom="8dp" android:right="8dp"/>
<!-- 有關顏色的填充,系統以最後一筆設定為主 -->
<!-- 填充顏色 -->
<solid android:color="@android:color/holo_green_light"/>
<!-- 漸層效果 (由右至左)-->
<gradient android:endColor="#eac100" />
<!-- 漸層效果 (由左至右)-->
<gradient android:startColor="@android:color/darker_gray" />
</shape>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 圓角 -->
<corners android:radius="8dp"/>
<!-- 外框線條 -->
<stroke android:width="2dp" android:color="@android:color/holo_orange_dark"/>
<!-- 文字與外框間隔 -->
<padding android:top="8dp" android:left="8dp" android:bottom="8dp" android:right="8dp"/>
<!-- 有關顏色的填充,系統以最後一筆設定為主 -->
<!-- 填充顏色 -->
<solid android:color="@android:color/holo_green_light"/>
<!-- 漸層效果 (由右至左)-->
<gradient android:endColor="#eac100" />
<!-- 漸層效果 (由左至右)-->
<gradient android:startColor="@android:color/darker_gray" />
</shape>
將欲改變外型的元件屬性 Background 指定此建立的 XML File 為:@drawable/view_border 外觀即會改變。
二、若要改變的是 Button 元件外觀及按下時以不同顏色顯示:
可以在 res/drawable 檔案夾下建立一 XML File,例如「btn_input_bg_selector.xml」及選取 selector 為根元件,並輸入以下內容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 當 button 處於 pressed 時的樣式。-->
<item android:state_pressed="true">
<shape>
<gradient android:startColor="#8600ff" />
<stroke android:width="2dp" android:color="#000000" />
<corners android:radius="5dp" />
<padding android:left="10dp" android:top="10dp" android:bottom="10dp" android:right="10dp" />
</shape>
</item>
<!-- button 處於一般時的樣式。-->
<item>
<shape>
<gradient android:endColor="#eac100" />
<stroke android:width="2dp" android:color="#333333" />
<corners android:radius="5dp" />
<padding android:left="10dp" android:top="10dp" android:bottom="10dp" android:right="10dp" />
</shape>
</item>
</selector>
二、若要改變的是 Button 元件外觀及按下時以不同顏色顯示:
可以在 res/drawable 檔案夾下建立一 XML File,例如「btn_input_bg_selector.xml」及選取 selector 為根元件,並輸入以下內容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 當 button 處於 pressed 時的樣式。-->
<item android:state_pressed="true">
<shape>
<gradient android:startColor="#8600ff" />
<stroke android:width="2dp" android:color="#000000" />
<corners android:radius="5dp" />
<padding android:left="10dp" android:top="10dp" android:bottom="10dp" android:right="10dp" />
</shape>
</item>
<!-- button 處於一般時的樣式。-->
<item>
<shape>
<gradient android:endColor="#eac100" />
<stroke android:width="2dp" android:color="#333333" />
<corners android:radius="5dp" />
<padding android:left="10dp" android:top="10dp" android:bottom="10dp" android:right="10dp" />
</shape>
</item>
</selector>
範例下載
全螢幕及無標題列
開啟 AndroidManifest.xml 檔案,在 Activity 標籤項加入
android:theme="@android:style/theme. ,按下 "Alt + /" 後選擇具有 NoTitleBar.Fullscreen 的屬性即可進入全螢幕及關閉標題列。
試了幾種樣式,大致上就是黑底、白底及按鈕的樣式不太一樣。比較特別是最後兩個,一個是「透明」的樣版,會將背景顯示出來,另一個則是背景會顯示成桌面的底圖。
android:theme="@android:style/theme. ,按下 "Alt + /" 後選擇具有 NoTitleBar.Fullscreen 的屬性即可進入全螢幕及關閉標題列。
Theme.NoTitleBar.Fullscreen
Theme.Black.NoTitleBar.Fullscreen
Theme.DeviceDefault.NoActionBar.Fullscreen
Theme.DeviceDefault.Light.NoActionBar.Fullscreen
Theme.Holo.Light.NoActionBar.Fullscreen
Theme.Light.NoTitleBar.Fullscreen
Theme.Translucent.NoTitleBar.Fullscreen
Theme.Wallpaper.NoTitleBar.Fullscreen
2016年6月13日 星期一
不同來源的事件處理
public class MainActivity extends Activity implements OnClickListener, OnLongClickListener {
private TextView mtxtR1, mtxtR2, mtxtR3;
private Button mbtnOK1, mbtnOK2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtxtR1 = (TextView) findViewById(R.id.txtR1);
mtxtR2 = (TextView) findViewById(R.id.txtR2);
mtxtR3 = (TextView) findViewById(R.id.txtR3);
mbtnOK1 = (Button) findViewById(R.id.btnOK1);
mbtnOK2 = (Button) findViewById(R.id.btnOK2);
mtxtR1.setOnClickListener(this);
mtxtR2.setOnClickListener(this);
mtxtR3.setOnClickListener(this);
mbtnOK1.setOnClickListener(this);
mbtnOK2.setOnClickListener(this);
mtxtR1.setOnLongClickListener(this);
mtxtR2.setOnLongClickListener(this);
mtxtR3.setOnLongClickListener(this);
mbtnOK1.setOnLongClickListener(this);
mbtnOK2.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View arg0) {
// TODO Auto-generated method stub
// 以 getResources() 方式拆解出元件名稱
String IdAsString = arg0.getResources().getResourceName(arg0.getId());
String StrArray[] = IdAsString.split("/");
Toast.makeText(this, "LongClick:" + StrArray[1], Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// 以 if 判斷式判斷點選的元件
if (arg0.getId() == R.id.txtR1) {
Toast.makeText(this, "Click:R.id.txtR1", Toast.LENGTH_SHORT).show();
} else if (arg0.getId() == R.id.txtR2) {
Toast.makeText(this, "Click:R.id.txtR2", Toast.LENGTH_SHORT).show();
} else if (arg0.getId() == R.id.txtR3) {
Toast.makeText(this, "Click:R.id.txtR2", Toast.LENGTH_SHORT).show();
} else if (arg0.getId() == R.id.btnOK1) {
Toast.makeText(this, "Click:R.id.btnOK1", Toast.LENGTH_SHORT).show();
} else if (arg0.getId() == R.id.btnOK2) {
Toast.makeText(this, "Click:R.id.btnOK3", Toast.LENGTH_SHORT).show();
}
}
}
2016年6月12日 星期日
亂數與Toast類別
public class MainActivity extends Activity {
private Button mbtnOK;
private String ShowStr[] = {
"心不專,做事難以成就。",
"發脾氣是短暫的發瘋。",
"把握當下,就是用心。",
"理直氣要和,得理要饒人。",
"平安是福,快樂是慧。"};
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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
index = (int)(Math.random() * ShowStr.length);
Toast.makeText(MainActivity.this, ShowStr[index], Toast.LENGTH_SHORT).show();
}
};
}
範例下載
2016年6月11日 星期六
ArrayAdapter 動態顯示選單
public class MainActivity extends Activity implements OnItemSelectedListener {
private Spinner mspin1, mspin2;
private Button mbtnOK;
private TextView mtxtR;
String mspin1_str[] = {"台中","宜蘭","花蓮"};
String mspin2_str1[] = {"太陽餅","三明治","牛軋糖"}; // 台中名產
String mspin2_str2[] = {"蜜餞","鴨賞","牛舌餅"}; // 宜蘭名產
String mspin2_str3[] = {"麻糬","小月餅","奶油酥條"}; // 花蓮名產
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mspin1 = (Spinner) findViewById(R.id.spin1);
mspin2 = (Spinner) findViewById(R.id.spin2);
mbtnOK = (Button) findViewById(R.id.btnOK);
mtxtR = (TextView) findViewById(R.id.txtR);
mspin1.setOnItemSelectedListener(this);
mbtnOK.setOnClickListener(mbtnOKOnClickListener);
// 將「地區」變數的陣列指派給 mspin1 下拉選單
ArrayAdapter
android.R.layout.simple_spinner_dropdown_item, // 下拉式選單的樣式
mspin1_str); // 將陣列 {"台中","宜蘭","花蓮"} 指派給 ArrayAdapter 型態的變數 tmp_spin1
mspin1.setAdapter(tmp_spin1);
}
private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mtxtR.setText(getString(R.string.stxtR) +
mspin1.getSelectedItem() + ", " + // 取得第一個項目點選的文字
mspin2.getSelectedItem()); // 取得第二個項目點選的文字
}
};
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
// TODO Auto-generated method stub
// 將所屬地區的「名產」變數陣列指派給 mspin2 下拉選單
switch (position) {
case 0:
ArrayAdapter
android.R.layout.simple_spinner_dropdown_item,
mspin2_str1); // 將陣列 {"太陽餅","三明治","牛軋糖"} 指派給 ArrayAdapter 型態的變數 tmp_spin2_1
mspin2.setAdapter(tmp_spin2_1);
break;
case 1:
ArrayAdapter
android.R.layout.simple_spinner_dropdown_item,
mspin2_str2); // 將陣列 {"蜜餞","鴨賞","牛舌餅"} 指派給 ArrayAdapter 型態的變數 tmp_spin2_2
mspin2.setAdapter(tmp_spin2_2);
break;
case 2:
ArrayAdapter
android.R.layout.simple_spinner_dropdown_item,
mspin2_str3); // 將陣列 {"麻糬","小月餅","奶油酥條"} 指派給 ArrayAdapter 型態的變數 tmp_spin2_3
mspin2.setAdapter(tmp_spin2_3);
break;
}
}
@Override
public void onNothingSelected(AdapterView parent) {
// TODO Auto-generated method stub
}
}
範例下載
ListView 選單
public class MainActivity extends Activity implements OnItemClickListener {
private TextView mtxtR;
private ListView mlv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtxtR = (TextView) findViewById(R.id.txtR);
mlv = (ListView) findViewById(R.id.lv);
mlv.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
// TODO Auto-generated method stub
// 方法一:將取得的 view 物件轉成 textView 後顯示出來
TextView txv = (TextView) view;
mtxtR.setText(getString(R.string.stxtR) + txv.getText().toString());
// 方法二: 先由 Strings.xml 取得選單的字串陣列, 再由點選的 position 值顯示
String spin_array[] =
getResources().getStringArray(R.array.region);
mtxtR.setText(getString(R.string.stxtR) + spin_array[position]);
}
}
ListView 元件屬性 Entries,將其指定至字串陣列即可顯示清單
<string-array name="region">
<item >台北</item>
<item >台中</item>
<item >高雄</item>
<item >花蓮</item>
</string-array>
範例下載
2016年6月10日 星期五
Spinner 下拉式選單
public class MainActivity extends Activity {
private Button mbtnOK;
private Spinner mspin1, mspin2;
private TextView mtxtR;
@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);
mspin1 = (Spinner) findViewById(R.id.spin1);
mspin2 = (Spinner) findViewById(R.id.spin2);
mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}
private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String spin_array[] =
getResources().getStringArray(R.array.spinner_list); // 取得選單的字串陣列
int index_spin1 = mspin1.getSelectedItemPosition(); // 取得下拉式選單被選取的位置
int index_spin2 = mspin2.getSelectedItemPosition(); // 取得彈出式選單被選取的位置
mtxtR.setText(
"下拉式選單選取:" + spin_array[index_spin1] + "\n" +
"彈出式選單選取:" + spin_array[index_spin2]);
}
};
}
Spinner 元件屬性 Entries,將其指定至字串陣列即可顯示選單
<string-array name="spinner_list">
<item>東華大學</item>
<item>台灣大學</item>
<item>交通大學</item>
</string-array>
Spinner 元件屬性 SpinnerMode,下拉式為:dropdown ,彈出式為:dialog
彈出式視窗可多指定屬性 prompt
<string name="title">請選擇學校</string>
CheckBox 多選選單
public class MainActivity extends Activity {
private Button mbtnOK;
private TextView mtxtR;
private CheckBox mchk3, mchk4;
@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);
mchk3 = (CheckBox) findViewById(R.id.chk3);
mchk4 = (CheckBox) findViewById(R.id.chk4);
mbtnOK.setOnClickListener(btnOKsetOnClickListener);
}
private View.OnClickListener btnOKsetOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String tmpstr = "";
CheckBox tmpchk;
// 以迴圈方式取得 CheckBox 核取項一、核取項二 是否被選取
int chk_id[] = {R.id.chk1, R.id.chk2};
for (int I: chk_id) {
tmpchk = (CheckBox) findViewById(I);
if (tmpchk.isChecked())
tmpstr += tmpchk.getText() + "\n";
}
// 直接讀取元件狀態判斷是否被核取
if (mchk3.isChecked())
tmpstr += mchk3.getText() + "\n";
if (mchk4.isChecked())
tmpstr += mchk4.getText();
mtxtR.setText(tmpstr);
}
};
}
訂閱:
意見 (Atom)





























