Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator04 [2015/03/16 01:51]
Andrei Roșu-Cojocaru
laboratoare:laborator04 [2017/02/20 20:54] (current)
Line 75: Line 75:
 <code xml> <code xml>
 <​activity <​activity
-  android:​name="​ro.pub.cs.systems.pdsd.lab04.MainActivity"​+  android:​name="​ro.pub.cs.systems.eim.lab04.MainActivity"​
   android:​label="​@string/​app_name"​ >   android:​label="​@string/​app_name"​ >
   <​intent-filter>​   <​intent-filter>​
-    <action android:​name="​ro.pub.cs.systems.pdsd.lab04.intent.action.MainActivity"​ />+    <action android:​name="​ro.pub.cs.systems.eim.lab04.intent.action.MainActivity"​ />
     <​category android:​name="​android.intent.category.LAUNCHER"​ />     <​category android:​name="​android.intent.category.LAUNCHER"​ />
   </​intent-filter>​   </​intent-filter>​
Line 99: Line 99:
 </​code>​ </​code>​
   * dacă se dorește rularea unei activități existente în cadrul altei aplicații, aceasta va trebui referită prin numele său complet, inclusiv denumirea pachetului care o identifică ​ <code java>   * dacă se dorește rularea unei activități existente în cadrul altei aplicații, aceasta va trebui referită prin numele său complet, inclusiv denumirea pachetului care o identifică ​ <code java>
-startActivity(new Intent("​ro.pub.cs.systems.pdsd.lab04.AnotherActivity"​));​+startActivity(new Intent("​ro.pub.cs.systems.eim.lab04.AnotherActivity"​));​
 </​code>​ </​code>​
  
Line 117: Line 117:
   * vizualizarea conținutului specificat în secțiunea ''​data''​ asociată intenției, sub forma unui URI, de către aplicații Android diferite, în funcție de schema (protocolul) utilizat (''​http''​ - navigator, ''​tel''​ - aplicația pentru formarea unui număr de telefon, ''​geo''​ - Google Maps, ''​content''​ - aplicația pentru gestiunea contactelor din agenda telefonică):​ <code java>   * vizualizarea conținutului specificat în secțiunea ''​data''​ asociată intenției, sub forma unui URI, de către aplicații Android diferite, în funcție de schema (protocolul) utilizat (''​http''​ - navigator, ''​tel''​ - aplicația pentru formarea unui număr de telefon, ''​geo''​ - Google Maps, ''​content''​ - aplicația pentru gestiunea contactelor din agenda telefonică):​ <code java>
 Intent intent = new Intent(Intent.ACTION_VIEW);​ Intent intent = new Intent(Intent.ACTION_VIEW);​
-intent.setData(Uri.parse("​http://​ocw.cs.pub.ro/​pdsd"));+intent.setData(Uri.parse("​http://​ocw.cs.pub.ro/​eim"));
 </​code>​ </​code>​
   * căutarea unor informații pe Internet folosind un motor de căutare, termenul căutat fiind indicat în secțiunea ''​extra''​ asociată intenției, fiind identificată prin cheia ''​SearchManager.QUERY'':​ <code java>   * căutarea unor informații pe Internet folosind un motor de căutare, termenul căutat fiind indicat în secțiunea ''​extra''​ asociată intenției, fiind identificată prin cheia ''​SearchManager.QUERY'':​ <code java>
Line 252: Line 252:
 <code xml> <code xml>
 <​activity <​activity
-  android:​name="​ro.pub.cs.systems.pdsd.lab04.AnotherActivity"​+  android:​name="​ro.pub.cs.systems.eim.lab04.AnotherActivity"​
   android:​label="​@string/​app_name"​ >   android:​label="​@string/​app_name"​ >
   <​intent-filter>​   <​intent-filter>​
-    <action android:​name="​ro.pub.cs.systems.pdsd.lab04.intent.action.AnotherActivity"​ />+    <action android:​name="​ro.pub.cs.systems.eim.lab04.intent.action.AnotherActivity"​ />
     <​category android:​name="​android.intent.category.DEFAULT"​ />     <​category android:​name="​android.intent.category.DEFAULT"​ />
     <data     <data
Line 292: Line 292:
   super.onCreate(state);​   super.onCreate(state);​
   setContentView(R.layout.activity_main);​   setContentView(R.layout.activity_main);​
-  Intent intent = new Intent("​ro.pub.cs.systems.pdsd.lab04.AnotherActivity"​);​ +  Intent intent = new Intent("​ro.pub.cs.systems.eim.lab04.AnotherActivity"​);​ 
-  intent.putExtra("​ro.pub.cs.systems.pdsd.lab04.someKey",​ someValue);+  intent.putExtra("​ro.pub.cs.systems.pdsd.eim.someKey",​ someValue);
   startActivityForResult(intent,​ ANOTHER_ACTIVITY_REQUEST_CODE);​   startActivityForResult(intent,​ ANOTHER_ACTIVITY_REQUEST_CODE);​
   // start another activities with their own request codes   // start another activities with their own request codes
Line 327: Line 327:
   // intent to parent   // intent to parent
   Intent intentToParent = new Intent();   Intent intentToParent = new Intent();
-  intent.putExtra("​ro.pub.cs.systems.pdsd.lab04.anotherKey",​ anotherValue);​+  intent.putExtra("​ro.pub.cs.systems.eim.lab04.anotherKey",​ anotherValue);​
   setResult(RESULT_OK,​ intentToParent);​   setResult(RESULT_OK,​ intentToParent);​
   finish();   finish();
Line 375: Line 375:
  
 <code java> <code java>
-final public static String SOME_ACTION = "​ro.pub.cs.systems.pdsd.lab04.SomeAction.SOME_ACTION";​+final public static String SOME_ACTION = "​ro.pub.cs.systems.eim.lab04.SomeAction.SOME_ACTION";​
  
 Intent intent = new Intent(SOME_ACTION);​ Intent intent = new Intent(SOME_ACTION);​
-intent.putExtra("​ro.pub.cs.systems.pdsd.lab04.someKey",​ someValue);+intent.putExtra("​ro.pub.cs.systems.eim.lab04.someKey",​ someValue);
 sendBroadcast(intent);​ sendBroadcast(intent);​
 </​code>​ </​code>​
Line 393: Line 393:
       android:​name="​.SomeEventBroadcastReceiver">​       android:​name="​.SomeEventBroadcastReceiver">​
       <​intent-filter>​       <​intent-filter>​
-        <action android:​name="​ro.pub.cs.systems.pdsd.lab04.SomeAction.SOME_ACTION"​ />+        <action android:​name="​ro.pub.cs.systems.eim.lab04.SomeAction.SOME_ACTION"​ />
       </​intent-filter> ​       </​intent-filter> ​
     </​receiver>​     </​receiver>​
Line 450: Line 450:
  
 <code java> <code java>
-final public static String SOME_ORDERED_ACTION = "​ro.pub.cs.systems.pdsd.lab04.SomeOrderedAction.SOME_ORDERED_ACTION";​+final public static String SOME_ORDERED_ACTION = "​ro.pub.cs.systems.eim.lab04.SomeOrderedAction.SOME_ORDERED_ACTION";​
  
 Intent intent = new Intent(SOME_ORDERED_ACTION);​ Intent intent = new Intent(SOME_ORDERED_ACTION);​
-intent.putExtra("​ro.pub.cs.systems.pdsd.lab04.someKey",​ someValue);​ +intent.putExtra("​ro.pub.cs.systems.pdsd.eim.someKey",​ someValue);​ 
-sendOrderedBroadcast(intent,​ "​ro.pub.cs.systems.pdsd.lab04.SOME_PERMISSION"​);​+sendOrderedBroadcast(intent,​ "​ro.pub.cs.systems.pdsd.eim.SOME_PERMISSION"​);​
 </​code>​ </​code>​
  
Line 462: Line 462:
     <​receiver     <​receiver
       android:​name="​.SomeEventOrderedBroadcastReceiver"​       android:​name="​.SomeEventOrderedBroadcastReceiver"​
-      android:​permission="​ro.pub.cs.systems.pdsd.lab04.SOME_PERMISSION">​+      android:​permission="​ro.pub.cs.systems.eim.lab04.SOME_PERMISSION">​
       <​intent-filter       <​intent-filter
         android:​permission="​100">​         android:​permission="​100">​
-        <action android:​name="​ro.pub.cs.systems.pdsd.lab04.SomeOrderedAction.SOME_ORDERED_ACTION"​ />+        <action android:​name="​ro.pub.cs.systems.eim.lab04.SomeOrderedAction.SOME_ORDERED_ACTION"​ />
       </​intent-filter> ​       </​intent-filter> ​
     </​receiver>​     </​receiver>​
Line 479: Line 479:
  
 <code java> <code java>
-final public static String SOME_STICKY_ACTION = "​ro.pub.cs.systems.pdsd.lab04.SomeStickyAction.SOME_STICKY_ACTION";​+final public static String SOME_STICKY_ACTION = "​ro.pub.cs.systems.eim.lab04.SomeStickyAction.SOME_STICKY_ACTION";​
  
 Intent intent = new Intent(SOME_STICKY_ACTION);​ Intent intent = new Intent(SOME_STICKY_ACTION);​
-intent.putExtra("​ro.pub.cs.systems.pdsd.lab04.someKey",​ someValue);+intent.putExtra("​ro.pub.cs.systems.eim.lab04.someKey",​ someValue);
 sendStickyBroadcast(intent);​ sendStickyBroadcast(intent);​
 </​code>​ </​code>​
Line 557: Line 557:
  
 <file java SomeFragment.java>​ <file java SomeFragment.java>​
-package ro.pub.cs.systems.pdsd.lab04;+package ro.pub.cs.systems.eim.lab04;
  
 import android.app.Fragment;​ import android.app.Fragment;​
Line 651: Line 651:
  
 <file java SomeFragment.java>​ <file java SomeFragment.java>​
-package ro.pub.cs.systems.pdsd.lab04;+package ro.pub.cs.systems.eim.lab04;
  
 import android.app.Activity;​ import android.app.Activity;​
Line 758: Line 758:
   tools:​context="​.MainActivity"​ >   tools:​context="​.MainActivity"​ >
   <​fragment   <​fragment
-    android:​name="​ro.pub.cs.systems.pdsd.labo04.Fragment1"​+    android:​name="​ro.pub.cs.systems.eim.labo04.Fragment1"​
     android:​id="​@+id/​fragment1"​     android:​id="​@+id/​fragment1"​
     android:​layout_weight="​1"​     android:​layout_weight="​1"​
Line 764: Line 764:
     android:​layout_height="​wrap_content"​ />     android:​layout_height="​wrap_content"​ />
   <​fragment   <​fragment
-    android:​name="​ro.pub.cs.systems.pdsd.labo04.Fragment2"​+    android:​name="​ro.pub.cs.systems.eim.labo04.Fragment2"​
     android:​id="​@+id/​fragment2"​     android:​id="​@+id/​fragment2"​
     android:​layout_weight="​1"​     android:​layout_weight="​1"​
Line 893: Line 893:
  
 În cazul evenimentelor produse la nivelul unui fragment, decizia cu privire la impactul pe care acesta îl are asupra interfeței grafice trebuie să aparțină activității. Astfel, fragmentul va invoca o metodă de callback la nivelul activității care va determina modul în care va fi tratat evenimentul. În cazul evenimentelor produse la nivelul unui fragment, decizia cu privire la impactul pe care acesta îl are asupra interfeței grafice trebuie să aparțină activității. Astfel, fragmentul va invoca o metodă de callback la nivelul activității care va determina modul în care va fi tratat evenimentul.
- 
-<columns 100% 33% 33%> 
  
 <code java> <code java>
Line 901: Line 899:
 }; };
 </​code>​ </​code>​
- 
-<​newcolumn>​ 
  
 <code java> <code java>
Line 924: Line 920:
 } }
 </​code>​ </​code>​
- 
-<​newcolumn>​ 
  
 <code java> <code java>
Line 946: Line 940:
 </​code>​ </​code>​
  
-</​columns>​+===== Activitate de Laborator =====
  
-===== Servicii =====+Se dorește implementarea unei aplicații Android, conținând o activitate conținând două fragmente, care să ofere utilizatorilor funcționalitatea necesară pentru a stoca un număr de telefon în agenda de contacte, specificând pentru acesta mai multe informații.
  
-TODO+{{ :​laboratoare:​laborator04:​activitate_de_laborator01.png?​nolink&​300 }}
  
-===== Activitate de Laborator =====+{{ :​laboratoare:​laborator04:​activitate_de_laborator02.png?​nolink&​300 }}
  
-==== Intenții ==== +**1.** În contul Github personal, să se creeze ​un depozit denumit '​Laborator04'​. Acesta ​trebuie să conțină unui fișier ''​README.md'', ​un fișier ''​.gitignore''​ specific unei aplicații Android ​și un fișier ''​LICENSE'' ​care să descrie condițiile pentru utilizarea aplicației.
-  - Să se creeze ​încă o fereastră (activitate) pe care să se afișeze o imagine. Aceasta ​trebuie să apară pe ecran în momentul în care se apasă butonul //​Fereastră Nouă//. +
-  - Să se adauge la fereastra creată anterior ​un buton de revenire. +
-  - Să se afișeze fereastra creată anterior ​și atunci când se apasă butonul //Inserați Fereastra//​. Să se afișeze sub imagine, într-un câmp text, care a fost butonul ce a determinat invocarea ferestrei. +
-  - Să se adauge la fereastra creată anterior un buton prin intermediul căruia ​să se schimbe imaginea existentă cu o alta.+
  
-==== Fragmente ==== +**2.** ​Să se cloneze într-un director de pe discul local conținutul ​depozitului la distanță astfel creat. În urma acestei operații, directorul Laborator04 va trebui să se conțină fișierele ''​README.md'',​ ''​.gitignore''​ care indică tipurile de fișiere (extensiile) ignorate și ''​LICENSE''​. <​code>​ 
-  - Să se plaseze ​conținutul ​celor două ferestre create anterior ​în două fragmente ​aparținând aceleiași activități, afișându-se simultan ​pe ecran. +student@eim2016:​~$ git clone https://​www.github.com/​perfectstudent/​Laborator04 
-  ​- Să se adauge ​un două butoane ​în cadrul primului ​fragment ​pentru ​atașarea, respectiv ​detașarea ​celui de-al doilea fragment ​de la activitate.+</​code>​ 
 + 
 +**3.** În directorul Laborator04 de pe discul local, să se creeze un proiect Eclipse denumit //​ContactsManager//​. 
 + 
 +Se utilizează următoarele detalii ale proiectului:​ 
 +  * **Application Name** - //Contacts Manager// 
 +  * **Project Name** - //​ContactsManager//​ 
 +  * **Package Name** - ''​ro.pub.cs.systems.eim.lab04.contactsmanager''​ 
 +  * **Minimum Required SDK** - API 16: Android 4.1 (Jelly Bean) 
 +  * **Target SDK** - API 16: Android 4.1 (Jelly Bean) 
 +  * **Compile With** - API 16: Android 4.1 (Jelly Bean) 
 +  * **Theme** - Holo Light with Dark Action Bar 
 + 
 +Ceilalți parametrii de configurare sunt impliciți:​ 
 +  * denumirea activității - ''​ContactsManagerActivity'';​ 
 +  * denumirea fișierului XML din ''​res/​layout''​ în care va fi construită interfața grafică - ''​activity_contacts_manager''​. 
 + 
 +**4.** În fișierul ''​activity_contacts_manager''​ din directorul ''​res/​layout''​ să se construiască interfața grafică folosind: 
 +  * editorul vizual (//​Graphical Layout//) 
 +  * editorul XML (manual) 
 + 
 +Acesta va fi format din două containere de tip ''​FrameLayout'' ​în care vor fi plasate fragmentele,​ dispuse vertical. 
 + 
 +**5.** Să se definească ​două fragmente: 
 +  * ''​BasicDetailsFragment''​ cu interfața grafică în fișierul ''​fragment_basic_details.xml''​ din directorul ''​res/​layout'';​ acesta va fi afișat în permanență în cadrul ​activității (pe metoda ''​onCreate()''​ a acesteia se adaugă o instanță a fragmentului la containerul ​ <code java> 
 +FragmentManager fragmentManager = getFragmentManager();​ 
 +FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();​ 
 +fragmentTransaction.add(R.id.containerTop, new BasicDetailsFragment());​ 
 +fragmentTransaction.commit();​ 
 +</​code>​ 
 +  * ''​AdditionalDetailsFragment''​ cu interfața grafică în fișierul ''​fragment_additional_details.xml''​ din directorul ''​res/​layout'';​ acesta va fi atașat / detașat la activitate la accesarea butonului //Show Additional Fields//, respectiv //Hide Additional Fields//. 
 + 
 +O clasă asociată unui fragment este derivată din ''​android.app.Fragment''​ și implementează metoda ''​onCreateView()'' ​pe care se încarcă interfața grafică corespunzătoare:​ 
 + 
 +<code java> 
 +public class SomeFragment extends Fragment { 
 +  @Override 
 +  public View onCreateView(LayoutInflater layoutInflater,​ ViewGroup container, Bundle state) { 
 +    return layoutInflater.inflate(R.layout.fragment_some,​ container, false); 
 +  ​} 
 +} 
 +</​code>​ 
 + 
 +**6**. ​Să se implementeaze intefețele grafice ale fragmentelor,​ conținând următoarele controale:​ 
 +  * ''​fragment_basic_details.xml''​ conține mai multe elemente dispuse vertical și ocupând pe lățime întregul spațiu avut la dispoziție:​ 
 +    * un buton (''​Button''​) având mesajul //Show Additional Fields// în cazul în care celălalt fragment nu este afișat, respectiv mesajul //Hide Additional Fields// ​în cazul în care celălalt ​fragment ​este afișat, determinând ​atașarea ​/ detașarea ​acestuia la activitate;​ 
 +    * patru controale ​de tip câmpuri text (''​EditText''​) prin care se introduc: 
 +      * numele; 
 +      * numărul de telefon ​- acest câmp este dezactivat (are proprietatea ''​android:​enabled="​false"''​),​ urmând ca valoarea sa să fie preluată din câmpul ''​extra'' ​al unei intenții;​ 
 +      * adresa electronică;​ 
 +      * adresa poștală. 
 +  * ''​fragment_additional_details.xml''​ conține patru controale ​de tip câmpuri text dispuse vertical și ocupând pe lățime întregul spațiu avut la dispoziție,​ prin care se introduc: 
 +    * poziția ocupată; 
 +    * denumirea companiei;​ 
 +    * site-ul web; 
 +    * identificatorul pentru mesagerie instantanee. 
 + 
 +**7.** Să se implementeaze interacțiunea cu utilizatorul a aplicației.  
 +  * în metoda ''​onActivityCreated()''​ a fragmentului ''​BasicDetailsFragment''​ se obțin referințe către butoanele //Show Additional Details// / //Hide Additional Details//, respectiv //Save// și //Cancel// prin intermediul metodei ''​getActivity().findViewById(R.id....)'';​ 
 +  * se implementează o clasă ascultător pentru butoane, care implementează ''​View.OnClickListener''​ și (re)definește metoda ''​onClick(View v)'';​ în funcție de identificatorul butonului care este transmis ca parametru al metodei, sunt realizate următoarele acțiuni: 
 +    * butonul //Show Additional Details// / //Hide Additional Details// - atașează / detașează fragmentul ''​AdditionalDetailsFragment'' ​la activitate ​în funcție de existența / inexistența acestuia, modificând corespunzător textul afișat pe buton: <​code>​ 
 +FragmentManager fragmentManager = getActivity().getFragmentManager();​ 
 +FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();​ 
 +AdditionalDetailsFragment additionalDetailsFragment = (AdditionalDetailsFragment)fragmentManager.findFragmentById(R.id.containerBottom);​ 
 +if (additionalDetailsFragment == null) { 
 +  fragmentTransaction.add(R.id.containerBottom,​ new AdditionalDetailsFragment());​ 
 +  ((Button)v).setText(getActivity().getResources().getString(R.string.hide_additional_fields));​ 
 +  fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);​ 
 +} else { 
 +  fragmentTransaction.remove(additionalDetailsFragment);​ 
 +  ((Button)v).setText(getActivity().getResources().getString(R.string.show_additional_fields));​ 
 +  fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_EXIT_MASK);​ 
 +} 
 +fragmentTransaction.commit();​ 
 +</​code>​ 
 +    * butonul //Save// - lansează în execuție aplicația Android nativă pentru stocarea unui contact în agenda telefonică,​ după ce în prealabil au fost preluate informațiile din controalele grafice: <code java> 
 +Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);​ 
 +intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);​ 
 +if (name != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.NAME,​ name); 
 +} 
 +if (phone != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.PHONE,​ phone); 
 +} 
 +if (email != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.EMAIL,​ email); 
 +} 
 +if (address != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.POSTAL,​ address); 
 +} 
 +if (jobTitle != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE,​ jobTitle);​ 
 +} 
 +if (company != null) { 
 +  intent.putExtra(ContactsContract.Intents.Insert.COMPANY,​ company); 
 +} 
 +ArrayList<​ContentValues>​ contactData = new ArrayList<​ContentValues>​();​ 
 +if (website != null) { 
 +  ContentValues websiteRow = new ContentValues();​ 
 +  websiteRow.put(ContactsContract.Data.MIMETYPE,​ ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);​ 
 +  websiteRow.put(ContactsContract.CommonDataKinds.Website.URL,​ website); 
 +  contactData.add(websiteRow);​ 
 +} 
 +if (im != null) { 
 +  ContentValues imRow = new ContentValues();​ 
 +  imRow.put(ContactsContract.Data.MIMETYPE,​ ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE);​ 
 +  imRow.put(ContactsContract.CommonDataKinds.Im.DATA,​ im); 
 +  contactData.add(imRow);​ 
 +} 
 +intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA,​ contactData);​ 
 +getActivity().startActivity(intent);​ 
 +</​code>​ Intenția pentru realizarea acestei operații are asociată acțiunea ''​ContactsContract.Intents.Insert.ACTION''​ și tipul ''​ContactsContract.RawContacts.CONTENT_TYPE''​. Informațiile care se doresc a fi completate sunt atașate în câmpul ''​extra''​ al acesteia, având cheile:\\ ✔ ''​ContactsContract.Intents.Insert.NAME'';​\\ ✔ ''​ContactsContract.Intents.Insert.PHONE'';​\\ ✔ ''​ContactsContract.Intents.Insert.EMAIL'';​\\ ✔ ''​ContactsContract.Intents.Insert.POSTAL'';​\\ ✔ ''​ContactsContract.Intents.Insert.JOB_TITLE'';​\\ ✔ ''​ContactsContract.Intents.Insert.COMPANY'';​\\ Pentru site-ul web și identificatorul de mesagerie instantanee,​ se folosește un tablou de elemente ''​ContentValues''​ în care se specifică înregistrări de tipul ''​CommonDataKinds.Website.URL'',​ respectiv ''​CommonDataKinds.Im.DATA'';​\\ Pentru a putea gestiona agenda telefonică,​ este necesar ca în fișierul ''​AndroidManifest.xml''​ să fie specificate următoarele permisiuni: <code xml> 
 +<​uses-permission 
 +  android:​name="​android.permission.READ_CONTACTS"​ /> 
 +<​uses-permission 
 +  android:​name="​android.permission.WRITE_CONTACTS"​ /> 
 +</​code>​ 
 +    * butonul //Cancel// - termină aplicația Android: <code java> 
 +getActivity().finish();​ 
 +</​code>​ 
 +  * se înregistrează o instanță a clasei ascultător ca mecanism de tratare a evenimentelor de tip accesare a butoanelor din cadrul interfeței grafice, prin apelul metodei ''​setOnClickListener()''​. 
 + 
 +**8.** Să se modifice aplicația Android [[https://​github.com/​eim2016/​Laborator03.git|Phone Dialer]] astfel încât să conțină un buton suplimentar prin care este invocată aplicația //Contacts Manager// căreia îi transmite numărul de telefon format și așteptând un rezultat cu privire la stocarea contactului în agenda telefonică. 
 + 
 +{{ :​laboratoare:​laborator04:​activitate_de_laborator03.png?​nolink&​300 }} 
 + 
 +{{ :​laboratoare:​laborator04:​activitate_de_laborator04.png?​nolink&​500 }} 
 + 
 +Metoda de tratare a evenimentului de tip accesare a butonului de stocare a numărului de telefon în agenda telefonică invocă o intenție asociată aplicației //Contacts Manager//, transmițând și numărul de telefon în câmpul ''​extra''​ asociat acesteia, identificabil prin intermediul unei chei. <code java> 
 +if (phoneNumber.length() > 0) { 
 +  intent = new Intent("​ro.pub.cs.systems.eim.lab04.contactsmanager.intent.action.ContactsManagerActivity"​);​ 
 +  intent.putExtra("​ro.pub.cs.systems.eim.lab04.contactsmanager.PHONE_NUMBER_KEY",​ phoneNumber);​ 
 +  startActivityForResult(intent,​ Constants.CONTACTS_MANAGER_REQUEST_CODE);​ 
 +} else { 
 +  Toast.makeText(getApplication(),​ getResources().getString(R.string.phone_error),​ Toast.LENGTH_LONG).show();​ 
 +} 
 +</​code>​ 
 + 
 +**9.** Să se modifice aplicația Android //Contacts Manager// astfel încât să poată fi lansată în execuție doar din contextul altei activități,​ prin intermediul unei intenții care conține în câmpul ''​extra''​ un număr de telefon, identificabil prin cheia ''​ro.pub.cs.systems.eim.lab04.contactsmanager.PHONE_NUMBER_KEY'',​ acesta fiind plasat în câmpul text needitabil corespunzător. Totodată, va transmite înapoi rezultatul operației de stocare (''​Activity.RESULT_OK''​ sau ''​Activity.RESULT_CANCELED''​). 
 + 
 +  * în fișierul ''​AndroidManifest.xml''​ se modifică filtrul de intenții (acțiunea și categoria), astfel încât activitatea să poată fi rulată doar prin intermediul unei intenții <file xml AndroidManifest.xml>​ 
 +<​manifest ...> 
 +  <​application ...> 
 +    <​activity 
 +      android:​name="​.graphicuserinterface.ContactsManagerActivity"​ 
 +      android:​label="​@string/​app_name"​ > 
 +      <​intent-filter>​ 
 +        <action android:​name="​ro.pub.cs.systems.eim.lab04.contactsmanager.intent.action.ContactsManagerActivity"​ /> 
 +        <​category android:​name="​android.intent.category.DEFAULT"​ /> 
 +      </​intent-filter>​ 
 +    </​activity>​ 
 +  </​application>​ 
 +</​manifest>​ 
 +</​file>​ 
 +  * în metoda ''​onActivityCreated()''​ asociată fragmentului ''​BasicDetailsFragment''​ este verificată intenția cu care este pornită activitatea părinte, și în cazul în care aceasta nu este nulă, este preluată informația din secțiunea ''​extra'',​ identificată prin cheia ''​ro.pub.cs.systems.eim.lab04.contactsmanager.PHONE_NUMBER_KEY'',​ conținutul său fiind plasat în cadrul câmpului text corespunzător:​ <code java> 
 +if (intent != null) { 
 +  String phone = intent.getStringExtra("​ro.pub.cs.systems.eim.lab04.contactsmanager.PHONE_NUMBER_KEY"​);​ 
 +  if (phone != null) { 
 +    phoneEditText.setText(phone);​ 
 +  } else { 
 +    Activity activity = getActivity();​ 
 +    Toast.makeText(activity,​ activity.getResources().getString(R.string.phone_error),​ Toast.LENGTH_LONG).show();​ 
 +  } 
 +}  
 +</​code>​ 
 +  * pe metodele de tratare a evenimentelor de accesare a butoanelor:​ 
 +    * //Save// - este lansată în execuție aplicația nativă pentru gestiunea agendei telefonice, folosind un cod de cerere prin intermediul căruia se va verifica rezultatul furnizat: <code java> 
 +getActivity().startActivityForResult(intent,​ Constants.CONTACTS_MANAGER_REQUEST_CODE);​ 
 +</​code>​ 
 +    * //Cancel// - se transmite înapoi rezultatul <code java> 
 +getActivity().setResult(Activity.RESULT_CANCELED,​ new Intent());​ 
 +</​code>​ 
 + 
 +  * în metoda ''​onActivityResult()''​ asociată activității ''​ContactsManagerActivity'',​ în momentul în care s-a părăsit aplicația nativă pentru gestiunea agendei telefonice, se verifică codul de cerere și se transmite înapoi un rezultat: <code java> 
 +public void onActivityResult(int requestCode,​ int resultCode, Intent intent) { 
 +switch(requestCode) { 
 +  case Constants.CONTACTS_MANAGER_REQUEST_CODE:​ 
 +    setResult(resultCode,​ new Intent());​ 
 +    finish(); 
 +    break; 
 +  } 
 +} 
 +</​code>​ 
 + 
 +**10.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator04'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​ 
 +student@eim2016:​~/​Laborator04$ git add * 
 +student@eim2016:​~/​Laborator04$ git commit -m "​implemented taks for laboratory 04" 
 +student@eim2016:​~/​Laborator04$ git push origin master 
 +</​code>​
  
 ===== Resurse Utile ===== ===== Resurse Utile =====
laboratoare/laborator04.1426463469.txt.gz · Last modified: 2017/02/20 20:44 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0