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 listAdapter = new 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 = new ArrayList();
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 元件顯示外觀:
  1. 在 res/drawable 檔案夾下建立一 XML File,例如「view_border.xml」並選取 shape 為根元件。
  2. 在新建立的 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>
將欲改變外型的元件屬性 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>







範例下載

全螢幕及無標題列

開啟 AndroidManifest.xml 檔案,在 Activity 標籤項加入
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 tmp_spin1 = new ArrayAdapter(this, 
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 tmp_spin2_1 = new ArrayAdapter(this, 
android.R.layout.simple_spinner_dropdown_item,
mspin2_str1);  // 將陣列 {"太陽餅","三明治","牛軋糖"} 指派給 ArrayAdapter 型態的變數 tmp_spin2_1
mspin2.setAdapter(tmp_spin2_1);
break;
case 1:
ArrayAdapter tmp_spin2_2 = new ArrayAdapter(this, 
android.R.layout.simple_spinner_dropdown_item,
mspin2_str2);  // 將陣列 {"蜜餞","鴨賞","牛舌餅"} 指派給 ArrayAdapter 型態的變數 tmp_spin2_2
mspin2.setAdapter(tmp_spin2_2);
break;
case 2:
ArrayAdapter tmp_spin2_3 = new ArrayAdapter(this, 
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);
}
};

}