昨天,已經說明第二段API,就是取得原來的資料,並且要資料顯示在對應的欄位。今天,就繼續來說明,在Android要如何連接在一起,如何要取得資料再回填到原來的欄位元件。完整的程式碼如下:
//宣告物件名稱。
private RequestQueue objqueue;
private final static String strurl = "http://192.168.63.231:8088/book/_api_gettags.php";
private Spinner lst_tag;
private EditText txt_name;
private EditText txt_content;
private TextView lbl_book_id;
ArrayList<String> arytags;
private StringRequest getRequest;
//第二次 GET 資料
private RequestQueue objgetrequestqueue;
private String strgeturl = "";
private StringRequest objgetstringrequest;
//宣告物件 (POST物件)
private RequestQueue objpostqueue;
private StringRequest postRequest;
private final static String strposturl = "http://192.168.63.231:8088/book/_api_updatebookinfo.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frm_book_edit);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//物件名稱跟Layout上的物件,產生連結。
lst_tag = (Spinner)findViewById(R.id.lsttag);
txt_name = (EditText)findViewById(R.id.txtname);
txt_content = (EditText)findViewById(R.id.txtcontent);
lbl_book_id = (TextView)findViewById(R.id.lblbookid);
arytags=new ArrayList<>();
//設定Volley物件。
objqueue = Volley.newRequestQueue(this);
//實做Volley物件,在StringRequest的函式,預設值就是Request.Method.GET,可以省略。
//而strurl,就是要GET的API網址。
//最後,還要Override二個監聽的事件。
getRequest = new StringRequest(strurl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//response,表示是回傳值,就是API要回傳的字串,也可以是JSON字串。
//宣告JSONArray時,要用try...catch包起來,不然會出現錯誤。
try{
//將JSON字串,放到JSONArray中。
JSONArray array = new JSONArray(response);
//解出JSON的資料,將所要的資料,再寫入陣列中。
for (int i = 0; i < array.length(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
String strtagname = jsonObject.getString("ctag_name");
arytags.add(strtagname);
}
}
catch(JSONException e) {
e.printStackTrace();
}
//將陣列跟Spinner物件連結在一起。
lst_tag.setAdapter(new ArrayAdapter<String>(frm_book_edit.this, android.R.layout.simple_spinner_dropdown_item, arytags));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//如果發生錯誤,就是回傳VolleyError,可以顯示是什麼錯誤。
}
});
//將getRequest物件加入Volley物件的queue中,執行跟API的溝通。
objqueue.add(getRequest);
//再取得編輯的資料。
Intent it2 = getIntent();
String strbook_name = it2.getStringExtra("pname");
prc_showmessage(strbook_name);
strgeturl = "http://192.168.231:8088/book/_api_getbookinfobyname.php?pname=" + strbook_name;
//設定Volley物件。
objgetrequestqueue = Volley.newRequestQueue(this);
//實做Volley物件,在StringRequest的函式,預設值就是Request.Method.GET,可以省略。
//而strurl,就是要GET的API網址。
//最後,還要Override二個監聽的事件。
objgetstringrequest = new StringRequest(strgeturl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//response,表示是回傳值,就是API要回傳的字串,也可以是JSON字串。
String strname = "";
String strcontent = "";
String strtagname = "";
String strbookid = "";
//宣告JSONArray時,要用try...catch包起來,不然會出現錯誤。
try{
//將JSON字串,放到JSONArray中。
JSONArray array = new JSONArray(response);
//解出JSON的資料,將所要的資料,再寫入陣列中。
for (int i = 0; i < array.length(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
strname = jsonObject.getString("cbook_name");
strcontent = jsonObject.getString("ccontent");
strtagname = jsonObject.getString("ctag_name");
strbookid = jsonObject.getString("cbook_id");
}
}
catch(JSONException e) {
e.printStackTrace();
}
//給修改的值
txt_name.setText(strname);
txt_content.setText(strcontent);
lbl_book_id.setText(strbookid);
try {
int intposition = 0;
intposition = ((ArrayAdapter) lst_tag.getAdapter()).getPosition(strtagname);
lst_tag.setSelection(intposition, true);
} catch (NullPointerException ex)
{
prc_showmessage(ex.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//如果發生錯誤,就是回傳VolleyError,可以顯示是什麼錯誤。
}
});
//將getRequest物件加入Volley物件的queue中,執行跟API的溝通。
objgetrequestqueue.add(objgetstringrequest);
}
執行出來的輸入畫面,如下圖所示:
後續的章節。來討論到如何更新資料庫。