Archive
การส่ง parameter หรือ data ให้กับ activity [Android เก็บเอามาเล่า] ต่อ
มีเพิ่มเติมต่ออีกในเรื่องของการ ส่งผ่านข้อมูลไปยัง activity (newActivity)อื่นในขณะที่สร้าง activity นั้น ยังมีต่ออีกนิส
ก็เนื่องจากว่า ความต้องการในการใช้งาน ในลักษณะนี้นั้นมี 2 ลักษณะคือ
1 สร้าง activity ที่ 2 แล้วเปิด (Fire and forget) ในกรณีนี้พูดไปแล้วนะครับ ในบทความที่แล้ว
2 สร้าง activity ที่ 2 เปิด แล้วรอ รับค่าส่งกลับ ( First and wait fore response – Ancy callback )
ในบทความนี้เรามาต่อการใช้งานในลักษณะที่ 2
หากเราต้องการ ที่จะ ให้ activity ที่ถูกสร้างขึ้นนั้น นั้นเป็น dialog รับค่าจากผู้ใช้แล้ว ส่งคืนกลับให้กับ activity ที่สร้างมัน (currentActivity) ทำอย่างไร
เรื่องนี้ เรื่องที่ค่อนข้างใช้บ่อยและสำคัญ ครับสำหรับการพัฒนาโปรแกรม เพื่อโต้ตอบกับผู้ใช้ มาดูวิธีการเลยนะครับ
ในการสราง activity แล้วรอ ค่าส่งกลับ เราทำดังนีนะครับ (สมมุติว่า acctivity ปัจจุบันคือ currentAcivity และ activity ที่จะใช้เป็น dialog คือ newActivity)

picture from http://croute.me/352
Intent newIntent = new Intent(this.getApplicationContext(),newActivity.class); Bundle bundle = new Bundle(); bundle.putString("param1","test"); newIntent.putExras(bundle); setartActivityForResult(newIntent,REQ_CODE);
** หมายเหตุ – code ด้านบน เขียนใน event อย่างเช่น onClickListener ของ view เป็นต้น
เช่น code เต็ม
.... final static int REQ_CODE = 1; ..... btnStartAct.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent newIntent = new Intent(this.getApplicationContext(),newActivity.class); Bundle bundle = new Bundle(); bundle.putString("param1","test"); newIntent.putExras(bundle); setartActivityForResult(newIntent,REQ_CODE ); }); }
ครับจาก code newActivity เป็น activity ที่เราต้องการสร้าง จาก currentActivity
สำหรับด้านรับข้อมูลด้าน (newActivity)
Bundle bundle = this.getIntent().getExtras(); if(bundle != null){ String param1 = bundle.getString("param1"); }
** ระวังเรื่องการส่งค่านะครับ ในกรณีนี้หากไม่กำหนดค่าให้ param1 ค่าจะเป็น null

picture from http://croute.me/352
ต่อ นะครับ สำหรับการส่งค่ากลับ ให้กลับ currentAcitivity พร้อมกลับ ส่งการ focus ให้กับ currentActivity ดังนี้
btnOk.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Bundle bundle = new Bundle(); bundle.putString(“status”, “OK”); Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); finish(); }); }
จะเห็นว่าการส่งค่ากลับนั้น ก็ส่งผ่าน Intent โดยใช้ putExtra method แล้วสั่ง finish เลย เป็นการเป็นหน้า activity ไปด้วยเลย สุดท้าย ในด้าน currentActivity ให้เขียน overried method ที่ชื่อว่า onActivityResult method จะถูกเรียกทันทีหลังจาก newActivity ปิดลงและส่งค่ากลับ ตัวอย่าง code ดังนี้ครับ

picture from http://croute.me/352
@Override protected void onActivityResult(int requestCode,int resultCode,String strdata,Bundle bundle) { Log.i(Global.TAG, "MainDriver main-activity got result from sub-activity"); if(resultCode == RESULT_OK) { // do something here .... // รับข้อมูลจาก bundle เหมือนปกติครับ } }
ครับ เป็นอันจบขั้นตอนการ ทำงานทั้งหมดแล้ว หวังว่า จะเป็นประโยชน์ต่อ หลายท่านที่กำลังค้นหาข้อมูลส่วนนี้อยู่นะครับ s_teerapong2000@yahoo.com
การส่ง parameter หรือ data ให้กับ activity [Android เก็บเอามาเล่า]
ในบางครั้งในการส้ราง activity นั้นเราอาจจะต้องการส่งผ่านข้อมูล ให้กับ activity เพื่อควบคุมอะไรบางอย่าง หรือ ให้ activity เอาไปประมวลผล อะไรก็ตาม ลองมาดูกันนะครับว่า มีวิธีการอย่างไร
สมมติว่า activity ปัจจุบัน ให้ชื่อว่า currentActivity และต้องการสร้าง activity ใหม่ (ให้ชื่อว่า newActivity ) พร้อมกับส่งผ่าน parameters ไปให้กับ newActivity
Intent I = new Intent(getApplicationContext(),newActivity.class); i.putExtra(“keyName”,”value”); startActivity(i);
จาก code นะครับการส่งผ่าน ทำได้โดยการ ใช้ method putExtra ของ intent เพื่อส่งผ่าน ค่า โดยให้ “keyName” เป็น ชื่อหรือตัวแปรที่ต้องการ และ “value” เป็นค่าที่ต้องการส่งนะครับ
ส่วนทาง newActivity ที่ต้องการรับ ค่าที่ส่งมาให้ทำดังนี้ครับ
Bundle extras = getIntent().getExtras(); If(extras != null){ String value = extras.getString(“keyName”); }
เป็นอันว่า เรียบร้อยครับการส่งผ่านข้อมูลไปยัง activity ที่ต้องการในขณะที่สร้าง acivitiy นั้น
สำหรับเรื่องนี้ มีต่อนะครับ …
เรื่อง การใช้ external libraries กับ Android ( external Jar )
เก็บเอาประสบการณ์มาเล่าให้ฟังต่อ เรื่อง external library เราจะเอามาใช้อย่างไร (ผมใช้ eclipse)
ครับเรื่องการใช้ external library ก็หมายถึงเราต้องการ เราสิ่งที่คนอื่นเขาเขียนแล้วมาใช้ซึ่งจะมาใหรูปแบบของ ไฟล์นามสกุล .jar การทำก็ไม่ใช่เรื่องยุ่งยากอะไร ถ้าทราบวิธี
นอกจากจะทำให้เราเรียกใช่งานได้แล้ว มันยังควบรวมเขาเป็นส่วนหนึ่งของ .apk file ในกรณีที่เรานำไปใช้ หรือ ทดสอบใน Emulator
ขั้นตอนก็มีดังนี้นะครับ
1.ให้เราสร้าง folder ที่ว่า libs [ชื่ออะไรก็ได้] ไว้ภายใต้ project folder
2. ให้ copy Jar file และ อื่น ๆ ที่รายล้อม jar file เช่น directory armeabi มาไว้ใน folder ที่เราสร้าง [libs]
3. หลังจากนั้นเรา click ขวาที่ jar file นั้น แล้วเลือก Build Path > Add to build path เราจะเห็น ว่า jar file นี้ถูกเพิ่มเข้าไปใน Referenced Library ใน project เป็น อันเสร็จครับ
Debug Certificate expired Error ?????
หวัดดีครับเพื่อน ๆ นักพัฒนาทั้งหลาย ช่วงนี้มีโอกาสได้ทำงานที่ต้องใช้ andriod นิสหน่อย ก็เลยเก็บประสบการณ์เอามาเล่าเผื่อว่า
จะเป็นประโยชน์ไม่มากก็น้อย แด่เพื่อน ๆ นักพัฒนาทั้งหลาย เรื่องนี้มันก็เกี่ยวกับ Error ที่น่าปวดหัวสำหรับนักพัฒนามือใหม่หัดขับ ที่อยากเริ่มต้นพัฒนาโปรแกรม ด้วย Andriod นะครับในส่วนของการ ติดตั้งนั้นผมก็คงไม่ต้องพูดถึงนะครับ มีให้ดูมากมายใน Net ทั้งที่เป็น ภาษาไทยและภาษาอังกฤษ แต่ที่ผมจะเอามาแบ่งปันก็เห็นจะเป็นเรื่อง Error ที่ จั่วหัวไว้นี่แหละครับ
มาดูปัญหาเริ่มแรกกันก่อนนะครับ คือว่า การสร้างโปรแกรมด้วย Andriod นั้นจะต้องมีการ ลงทะเบียน certificate ของผู้ใช้งาน หรือผู้พัฒนาโปรแกรม เพื่อให้สามารถตรวจสอบที่มาที่ไปของโปรแกรมได้นั่นเอง ปัญหาก็คือในบางครั้งหลังจากติดตั้ง Andriod SDK แล้ว (ผมใช้กับ eclipse นะครับ) สมมติว่า สมบูรณ์แล้ว เราก็เริ่มที่จะเขียน ทดสด 1 โปรแกรม สั้น ๆ ยอดฮิต “helloWorld” หลังจากนั้น ก็ทำการ compile และ run ครับ (อย่าลืม Setup emulator นะครับ) ปรากฎว่า ได้ข้อความที่แสดงข้อผิดพลาดออกมา ประมาณว่า ” Error generating final archive: Debug certificate expired on ……. Unknown Android Packaging Problem ”
ครับ อืมเวรละซิ
เอา Error message ค้น google ดู ครับ โห ออก มามากมาย ซึ่งสามารถแก้ไขได้ดังนี้
– ให้ลบ debug.keystore ออก ซึ่งอยู่ใน (c:\users\[username]\.andriod\ – windows7 นะคราบบบ) ออกไป เดี๊ยว sdk จะสร้างให้ใหม่
– แล้ว ทำการ clean ใน project ที่กำลังทำงานอยู่ แล้วลอง Run ใหม่ ( หลายท่านทำแค่นี้จบครับ ทำงานได้เลย แต่ของกระผมไม่จบ )
ทำไม ?????
หาต่อ อีก หลายที่ให้ คำแนะนำมาว่า เอางี้ ถ้า วิธีนั้นไม่ work ลองวิธีนีดู ให้สร้าง debug.keystore ( แม่งเองเลยดิ ) ทำไง หล่ะ
ก็ command line เลยครับ ใช้ตามนี้เลยนะครับ
C:\Users\teerapong\.android>keytool -genkey -keypass android -keystore debug.key store -alias androiddebugkey -storepass android -validity 1000 -dname “CN=Androi d Debug,O=Android,C=US”
[ในกรณีนี้ผม แอบไป add ตัวแปร path ชี้ไปที่ C:\Program Files\Java\jre6\bin ไว้แล้วเน่อ คิดว่าหลายท่านคงทราบนะครับ เพราะคำสั่ง keytool มานเป็น ของ jre]
ก่อน run ก็ให้ลบของเดิมออกก่อนนะครับ ในขั้นตอนแรก นั่นแหละครับ หลังจากนั้นจึง run คำสั่ง จบ ไหม NO !!!!
โอย อะไร กันหล่ะนี้ หาไปอีกหลายที่ เขาก็บอกกันแค่นี้ ครับ ไปต่อไม่ได้เลย ผมล่วงไป อย่างน้อย 50 เส้น
กลับไปอ่าน online document ใหม่อีกรอบ หนึ่งปรากฏว่า เขาก็บอกไว้ครับ ว่าหากทำจนครบแล้วมันไม่ work ให้มาดู อีกที่หนึ่ง สิว่า เครื่องที่ท่านพัฒนาอยู่ นั้น calendar เป็น Gregorian หรือป่าว ถ้าไม่เป็น debug.keystore สร้างให้ตายไงก็ Expired ครับ –> เหรอ !!!!!!
เขาก็แนะว่า ให้ท่านเปลี่ยน ให้เป็น Gregorion calendar แล้วก็ สร้าง debug.keystore แล้ว ก็ใช้ได้เลย หลังจากนั้นก็เปลี่ยนกลับมาเป็น none-Gregorion date ก็จบ จบจริงครับ โล่งไป ฮะ ฮะ ยังมีหลายท่านสงสัยว่า แล้ว ไอ้ Gregorion calendar ยังไง (ผมเองก็ไม่รู้ว่ายังไง เขาแนะต่อว่า ให้ไปเปลี่ยน ใน Reginal and language ให้เป็น Us เป็นต้น ก่อนแล้วก็ทำ key แล้วเอา key มาใช้แล้วเปลี่ยนกลับ จบครับ หลังจากนี้ ก็ จบปัญหา ครับ
หวังว่ามันจะเป็นประโยชน์ไม่มากก็น้อย สำหรับเพื่อน ๆ นักพัฒนาทั้งหลาย ขอให้สนุกกับการเขียนโปรแกรม นะครับ
s_teerapong2000@yahoo.com
s.teerapong@gmail.com